質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.49%
Perl

Perlは多目的に使用される実用性が高い動的プログラミング言語のひとつです。

正規表現

正規表現とは特定の文字列によるパターンマッチングを行う際に用いられる宣言型プログラミングです。

Q&A

3回答

1383閲覧

同一地点が無いと成功しない理由って何

aaaaaaaa

総合スコア501

Perl

Perlは多目的に使用される実用性が高い動的プログラミング言語のひとつです。

正規表現

正規表現とは特定の文字列によるパターンマッチングを行う際に用いられる宣言型プログラミングです。

1グッド

0クリップ

投稿2016/12/27 11:05

編集2016/12/28 03:10

正規表現の肯定的先読みと後読みについてなのですが、
このようにすると既に読んだ部分に「jeff」という文字列があり、まだ読んでいない位置に「s」があればマッチし、jeffとsの間にアポロストロフィが追加されます。

s/(?<=jeff)(?=s)/'/

これを逆にすると

s/(?=s)(?<=jeff)/'/

まだ読んでいない部分にsがあって、既に読んだ部分にjeffがあったらマッチをする、と思っていたのですが、
下記の正規表現を確認してくれるサイトで試したところ、マッチしませんでした。
正規表現チェッカー

詳説正規表現第三版(62p)によれば、

s/(?=s\b)(?<=\bJeff)/'/gはどのような挙動を示すか?

この場合、「(?=s\b)(?<=\bJeff)」のどちらを先にするかはどうでもよいことだ。"右側をチェックしてから左側をチェック"しても、その逆でも、2つのチェックの組み合わせを成功させるためには、2つのチェックが同じ位置で成功しなければならないというところがポイントである。例えば、"Thoma▲s Jeff▲erson"という文字列には、「(?=s\b)」も「(?<=\bJeff)」もマッチするが(マークを付けた位置で)、両方が成功する同一地点は、存在しないので二つの組み合わせは、マッチに至らない。
これについて、"2つの組み合わせ"というちょっとあいまいな表現を使っていも、今のところはよいだろう。この場合なら、この表現の意味は直感的にわかる。しかし、正規表現エンジンが正規表現を適用する様子が必ずしも直感的にわかるとは言えない場合がときどきある。正規表現エンジンの挙動の仕組みは正規表現の本当の意味に現実的な影響を与えるので、4章では、これを正面から詳しく見ていくつもりだ。

正規表現は、左から右へ処理するので、左にまだ読んでいない部分があるのに、そのさきに既に読んだ部分という矛盾が
発生するから上手くマッチしないのか、と思っておるのですが、実際はどうなのでしょうか。

maisumakun👍を押しています

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ikedas

2016/12/27 12:47

引用の範囲が不十分で、回答者に質問の意味が伝わらないです。「同一地点」という言葉を著者がどういう意味で使っているかわかるように、範囲を広げて下さい。最低、「Thomas Jefferson」との比較はないとわかりません。
aaaaaaaa

2016/12/28 03:12

ご返答有難うございます。申し訳ありませんでした。最初から最後まで引用しました。
otn

2016/12/28 04:46

「質問者の勘違いで、意味無し質問でした」という結論で良いですか?
guest

回答3

0

日本語版でどのように訳されているかは知りませんが、原文を読む限り、

両方が成功する同一地点は、存在しないので二つの組み合わせは、マッチに至らない。

は、Thomas Jeffersonという文字列に対して(?=s\b)(?<=\bJeff)というパターンをマッチさせた場合の説明です。
https://books.google.co.jp/books?id=GX3w_18-JegC&lpg=PR1&hl=ja&pg=PA64#v=onepage&q&f=false

For example, in the string 'Thoma.s Jeff.erson', both 「(?=s\b)」 and 「(?<=\bJeff)」 can match (at the two locations marked), but since there is no one position where both can be successful, the combination of the two cannot match.

日本語版の記述が、どう読んでも上の原文と食い違っているように思える場合は、誤訳の可能性があります。
出版社に連絡すると、何らかの謝礼があるかも知れません。


ちなみに、
「正規表現チェッカーでは(?=s)(?<=jeff)がマッチしなかった」
とのことですが、同サイトでは(?<=jeff)(?=s)もマッチしません。

おそらく、同サイトの実装に問題があり、先読みと後読みを同時に処理できないようになっていると思われます。

otn様の環境では

Perl5.10とRuby2.3ではどちらも成功しますね。

とのことですが、私の環境(※)では、PHP5.4 で(?=s)(?<=jeff)(?<=jeff)(?=s)の両方が'jeffs'にマッチすることが確認できました。
※ Max OS X 10.9

php

1<?php 2var_dump(preg_match('/(?=s)(?<=jeff)/', 'jeffs', $m)); 3var_dump($m); 4 5var_dump(preg_match('/(?<=jeff)(?=s)/', 'jeffs', $m)); 6var_dump($m);

実行結果

int(1) array(1) { [0]=> string(0) "" } int(1) array(1) { [0]=> string(0) "" }

動作確認はご自分の環境のプログラム言語で実施することをお勧めします。

投稿2016/12/27 16:59

編集2016/12/27 17:31
KiyoshiMotoki

総合スコア4791

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

Perl5.10とRuby2.3ではどちらも成功しますね。

両方が成功する同一地点は、存在しないので二つの組み合わせは、マッチに至らない。

については、読んでなくて文脈がわからないので何とも。

投稿2016/12/27 12:14

otn

総合スコア84489

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

他人の文章を引用するときは、書いた人の意図が伝わるような必要にして最小限の範囲を引用して下さい。最小限なだけでは、なぞなぞみたいになってしまいます。だいたい、意図が伝わらないような紹介のしかたは文章を書いた人に対して失礼でしょう。

(以上は編集前の質問に対するコメントです。)


(?=s)(?<=Jeff)」について。

「正規表現チェッカー」でも‘Jeffs’ にはマッチします。PerlやPCREによる正規表現ルーチンではすべてマッチするはずです (Tclでの実装は私は未確認です)。原文でも、先読み・後読みの順序は「この場合、(…) どうでもよいことだ」(In this case, it doesn't matter (...)) と述べています。

他に ‘Thomas Jefferson’ にマッチを試みる場合についても説明しています。これはマッチしません。なぜなら、「(?=s)」と「(?<=Jeff)」がマッチする点が同じではないからです (ちなみに、「同一地点」(the same point) は訳がややおおげさかと。単に「同じ点」でいいと思います)。

そして、質問者さんが問題にしている「二つの組み合わせ」や「同一地点」という言葉ですが、直後で著者は「二つの組み合わせ」(combination of the two) を「直感的」(intuitive) な意味で使っていると断っており、正規表現の挙動についての直感的でないきちんとした議論は4章 (次の章) でするとしています。ですから、ここで個々の言葉づかいに焦点を当てても得るものはないです。

回答

4章以降も読んでから、あらためて疑問の点をご質問いただけませんか。

投稿2016/12/28 03:02

編集2016/12/30 01:28
ikedas

総合スコア4306

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.49%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問