正規表現で以下のテキストから、「」を含む部分を抽出したいのですが、うまくいきません。


「aaaaaaaaaaaa」bbbbbbbbbbbbbbb「cccccccccccccccccc」dddddddddd「eeeeeeeeee」

[「]^[「『]+[」]

上記の正規表現を行うと、「aaaaaaaaaaaa」、「cccccccccccccccccc」、「eeeeeeeeee」を抽出したいのですが、bbbbbbbbbbbbbbb、ddddddddddも引っかかってしまいます。

この問題を解決するには、どのような正規表現にすればいいのでしょうか?

回答の条件
  • URL必須
  • 1人2回まで
  • 登録:2008/02/11 09:47:34
  • 終了:2008/02/18 09:50:02

回答(6件)

id:bayan No.1

bayan回答回数100ベストアンサー獲得回数132008/02/11 10:28:38

ポイント19pt

^[「『]+


の意図するところは、"「" と "『" 以外の文字の1個以上の繰り返し、でしょうか。

であればここは、

[^「『]+

でしょうかね。

http://ja.wikipedia.org/wiki/%E6%AD%A3%E8%A6%8F%E8%A1%A8%E7%8F%B...


[^ ] 括弧内に含まれない一文字にマッチする。例えば、[^abc] は a、b、c 以外の任意の文字にマッチする。[^a-z] は小文字以外の任意の一文字にマッチする。上と同様にこれらは混ぜることが出来る。

^ 行の最初にマッチする。



PHPで preg_match や、ereg の関数使っているのかなと勝手に想像したのですが、正規表現を利用できる環境はいろいろあり(PHP,Perl,Java,awk,sed,秀丸,vim...etc)、各々方言とかクセがあったと思うので、「何」で「どのように」を詳細に書いたほうがいいかもしれません。


あとコメントをオープンにしていただいた方が、質問や意見がしやすいので、

回答を集めやすいかもしれません。

id:takets

ありがとうございます。

pythonで試していたのですが、だいたい目的のことができるようになりました。

2008/02/12 22:56:09
id:imai164 No.2

imai164回答回数4ベストアンサー獲得回数02008/02/11 10:30:14

ポイント19pt

「[^「」]+」

で試してみてください。

一応秀丸エディタで確認しましたがうまくいくと思います。

URL必須なのでWikipediaのページを…

http://ja.wikipedia.org/wiki/%E6%AD%A3%E8%A6%8F%E8%A1%A8%E7%8F%B...

id:takets

ありがとうございます。

2008/02/12 22:56:19
id:Mook No.3

Mook回答回数1312ベストアンサー獲得回数3912008/02/11 10:32:51

ポイント18pt

言語の指定がありませんでしたので、Perl での例ですが、

    my $t = "「aaaaaaaaaa」bbbbbbbbbb「cccccccccc」dddddddddd「eeeeeeeeee」"; 
    while ($t =~ /(.+?)/g){ push(@word, $1); } 
    print "@word\n"; 

で下記のような結果になります。

「aaaaaaaaaa」「cccccccccc」「eeeeeeeeee」

http://www.rfs.jp/sb/perl/02/09.html

id:takets

ありがとうございます。

2008/02/12 22:56:28
id:tezcello No.4

tezcello回答回数460ベストアンサー獲得回数692008/02/11 21:46:16

ポイント18pt

PHP だとこんな感じですけど。

http://www.php.net/manual/ja/function.preg-match-all.php

$str = '「aaaaaaaaaaaa」bbbbbbbbbbbbbbb「cccccccccccccccccc」dddddddddd「eeeeeeeeee」';
preg_match_all('/「(.+?)」/', $str, $res);
var_dump($res);

で、結果は

array(2) {

[0]=>

array(3) {

[0]=>

string(18) "「aaaaaaaaaaaa」"

[1]=>

string(24) "「cccccccccccccccccc」"

[2]=>

string(16) "「eeeeeeeeee」"

}

[1]=>

array(3) {

[0]=>

string(12) "aaaaaaaaaaaa"

[1]=>

string(18) "cccccccccccccccccc"

[2]=>

string(10) "eeeeeeeeee"

}

}

id:takets

ありがとうございます。

pythonで実行していましたが、できるようになりました。

ただ、zzzzzzzzzzzzzzzzzzzzz「aaaaaaaaaaaa」bbbbbbbbbbbbbbb「cccccccccccccccccc」dddddddddd「eeeeeeeeee」

の場合、zzzzzzzzzzzzzzzzzzも取得できてしまうようですが、必要な分は解決できました。

2008/02/12 22:57:38
id:tezcello No.5

tezcello回答回数460ベストアンサー獲得回数692008/02/14 09:46:37

ポイント18pt

コメントが出来ませんのでこちらに書きますが、この回答にはポイント不要です。


うちのPHPでは、z が先頭にあっても問題無く動作するようです。言語によって実装に差があるのかも知れませんね。

「  」 で挟まれた文字の1回以上の繰り返し(最短でマッチ)というつもりの正規表現なので、???って感じですが...

http://www.kt.rim.or.jp/~kbk/regex/regex.html

http://www.php.net/manual/ja/reference.pcre.pattern.syntax.php

$str = 'zzzzzzzzzzzzzzzzzzzzz「aaaaaaaaaaaa」bbbbbbbbbbbbbbb「cccccccccccccccccc」dddddddddd「eeeeeeeeee」';
preg_match_all('/「(.+?)」/', $str, $res);
var_dump($res);

array(2) {

[0]=>

array(3) {

[0]=>

string(16) "「aaaaaaaaaaaa」"

[1]=>

string(22) "「cccccccccccccccccc」"

[2]=>

string(14) "「eeeeeeeeee」"

}

[1]=>

array(3) {

[0]=>

string(12) "aaaaaaaaaaaa"

[1]=>

string(18) "cccccccccccccccccc"

[2]=>

string(10) "eeeeeeeeee"

}

}

id:YOSIZO No.6

YOSIZO回答回数64ベストアンサー獲得回数12008/02/15 14:54:55

ポイント18pt

正規表現でいう、「貪欲(Greedy)マッチ」「最長(longest)マッチ」と呼ばれる問題ですかね。

PHPは基本的に貪欲(Greedy)マッチで、条件を満たす最も長い文字列を返すのですが、特にPHPの場合は ereg系/mb_ereg系/preg系関数でそれぞれ挙動が異なる場合がありますので注意が必要ですね。

ちなみに、PHPのpreg系関数ではパターン修飾子にUを指定するとUNGREEDYなマッチを行う事も出来ます。

http://jp.php.net/manual/ja/reference.pcre.pattern.modifiers.php

コメントはまだありません

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません