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

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

新規登録して質問してみよう
ただいま回答率
85.50%
正規表現

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

Q&A

解決済

1回答

1364閲覧

エラーにならない条件、とは

aaaaaaaa

総合スコア501

正規表現

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

0グッド

0クリップ

投稿2016/12/08 10:52

編集2016/12/12 10:58

詳説正規表現第三版の59pに関する質問です。
Jeffsという固有名詞にアポロストロフィをつける、つまり置換する方法として固有名詞のうちsを除いたJeffを消費し、sを先読みすることで消費しないやり方を解説しているのですが、

s/\bJeff(?=s\b)/Jeff'/g

> **この場面で先読みを使う唯一のメリットは、他の方法ではエラーにならない条件でも、正規表現全体を不成功にできることである。**言い換えれば、「Jeff」だけにマッチするようなふりをして、「Jeffs」全体をチェックできることだ。 この引用のうち太字の部分の意味がさっぱり理解できません。sを先読みにすることで、sが消費されないことは分かるのですが、**他の方法でエラーにならない条件、正規表現全体を不成功にできる、**とはいったいどういう意味なのでしょうか。

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

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

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

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

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

KSwordOfHaste

2016/12/08 11:04 編集

質問からどんな正規表現を使っているか推測できる方も多いのだろうと思いますが、正規表現そのものも(本件に関係する範囲に短縮して)質問に記載すべきと思います。そのほうがより多くの人の参考としてわかりやすくないですか?
ikedas

2016/12/08 12:50

コンピュータ関係の翻訳書では特によくあることですが、訳者もよく理解していないまま日本語にしていることがあります。そういう箇所は読者にも理解できません。原著の該当箇所を読んでみては (嫌味とかではなく、私はそういう理由で訳書と原書と両方買う経験をよくするので) 。
aaaaaaaa

2016/12/09 11:02

>>KSwordOfHasteさん ご返答有難うございます。編集いたしました。
aaaaaaaa

2016/12/09 11:04

>>ikedasさん ご返答有難うございます。洋書の翻訳をじっくり読むのは、初めてだったのですが、訳書にはそういういい加減なところもあるのですね。勉強になります。
ikedas

2016/12/10 03:21

引用は正確でしょうか。Perlの式から問題の文までの間の文章もとばさず引用して下さい (図はとばしてもいいです)。また式も、本に書いてある通りか確認して下さい。
aaaaaaaa

2016/12/12 10:57

ご返答とご指摘有難うございます。式に間違いがありました。修正します。
guest

回答1

0

ベストアンサー

コメントで偉そうなことを言った手前、原文の該当箇所を読んでみました。

After 「Jeff」 matches, the lookahead is attempted. It is successful only if 「s\b」 can match at that point (i.e., if ‘s’ and a word boundary is what follows ‘Jeff’). But, because the「s\b」 is part of a lookahead subexpression, the ‘s’ it matches isn't actually considered part of the final match. Remember, while「Jeff」selects text, the lookahead part merely “selects” a position. The only benefit, then, to having the lookahead in this situation is that it can cause the whole regex to fail in some cases where it otherwise wouldn't. Or, another way to look at it, it allows us to check the entire 「Jeffs」 while pretending to match only 「Jeff」.

(強調引用者。強調箇所はご質問で強調されている箇所と同じ)

また、この少し前に出てくるPerlの式は、次のようになっています。

s/\bJeff(?=s\b)/Jeff'/g

訳書はまだ読んでいません。


さて、「wouldn't otherwise」のような言い回しには (特に関係節の中にあるとき)、「いろいろと手を尽くしても、できない (本人の力だけではどうにもならない)」といったニュアンスがあります。「otherwise」だけを取り立てて「ほかの方法では」と訳すと、ぎこちない感じです。また、「wouldn't」の後に省略されているのは「fail to match」でしょう。「エラーにな(る)」とするのは唐突に感じます。

あと、ご質問と直接関係ないですが、「the only benefit」を「唯一のメリット」としているのも、わかりにくいです。また挿入句の「then」が抜けています。

これらに気を付けながら、言葉を補って日本語にしてみます。

Jeff」がマッチした後に、先読みが試行される。それ〈= 先読み〉は、「s\b」がその点でマッチできる (つまり、‘Jeff’ の後に ‘s’ および語の境界が続く) ときに限り成功する。だが、「s\b」は先読みの部分表現の一部だから、それ〈= 先読み〉がマッチした ‘s’ は実際には最終的なマッチの一部とみなされない。思い出してほしいのだが、「Jeff」〈という部分表現〉は〈Jeffというある範囲の〉テキストを選択するのに対し、先読み部分はただ一点しか「選択」しない。**そして、こういう状況で〈普通のマッチではなく〉先読みを使うことに利点があるとすれば、それ〈= 最終的にマッチさせたい正規表現〉がどうしても〈マッチに失敗〉してくれないような場合でも、それ〈= 先読み〉〈の失敗〉で正規表現を丸ごと〈マッチに〉失敗させることができる、という点だろう。**別の見かたをすると、〈先読みを使えば〉「Jeff」だけにマッチしたように見せかけながら「Jeffs」全体〈にマッチするかどうか〉を調べることができる〈ということだ〉。

(強調は同上)

つまり、最終的にマッチさせたい範囲の外でのマッチの結果を使って、マッチさせるか否かを制御できる、ということを言っているのではないでしょうか。

やや超訳ぎみですし、誤りもあるかもしれません。ご指摘下さい。

投稿2016/12/11 11:17

編集2016/12/12 12:11
ikedas

総合スコア4227

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

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

KSwordOfHaste

2016/12/12 03:53

ピンとこない訳文があったときikedasさんの翻訳のようにつっこんで訳されているものがあると「体裁の良い」訳よりわかりやすいですねw; 原文の方の例はs/\bJeffs\b/Jeff's/gと書けば済むのでこれだけみても「先読みの有用性」を表す直接的な例ではないのですが原著者の意図は以下のような例を連想してほしいということなのだと思います。 s/\b(Jeff|Tom)(?=s\b)/\1'/g \1にマッチさせたい範囲は「人の名前から所有を表すsを除いた部分」でないと困りますが、先読みを使わないs/\b(Jeff|Tom)/\1'/gだと、意図しないケースがアンマッチにできないということだと思います。ikedasさんの最後の結論を具体例でいうとこういうことですよね。
ikedas

2016/12/12 05:51 編集

はい、そういうことです。:) 原文でもすぐ前に「単にJeffsを置換するだけならs/\bJeffs\b/Jeff's/gでいい」という趣旨の説明があります。実は、引用箇所が含まれる節での最終目標は「数字に3桁毎のカンマを入れたい」ということで、そのために先読みマッチを使うので、どんなものか解説しているところです。この後で s/(?<=\bJeff)(?=s\b)/'/g といったものも出てきます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問