5

次のステートメントに一致する必要があります。

Hi there John
Hi there John Doe (jdo)

これらを一致させずに:

Hi there John Doe is here 
Hi there John is here

だから私はこの正規表現が機能するだろうと考えました:

^Hi there (.*)(?! is here)$

しかし、そうではありません-そしてその理由はわかりません-これはキャプチャグループ(。*)が原因である可能性があると思いますので、*演算子を怠惰にすることで問題が解決すると思いました...しかし違います。この正規表現も機能しません:

^Hi there (.*?)(?! is here)$

誰かが私を解決策の方向に向けることができますか?

解決

(のように)最後にない 文を取得するには、 (author @Thorbear)を使用する必要があります。is hereHi there John Doe (the second)

^Hi there (.*$)(?<! is here)

また、途中にデータが含まれている文の場合(たとえばHi there John Doe (the second) is hereJohn Doe(2番目)が目的のデータである場合)、単純なグループ化で十分です。

^Hi there (.*?) is here$

           ╔══════════════════════════════════════════╗
           ║▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒║
           ║▒▒▒Everyone, thank you for your replies▒▒▒║
           ║▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒║
           ╚══════════════════════════════════════════╝
4

3 に答える 3

4

行の.*終わりにはis here(当然のことながら)フォローがないため、貪欲であるかどうかに関係なく一致が見つかります。

これに対する解決策は、代わりにルックビハインドを使用することです(過去の数文字がと一致する場合は、行の終わりからチェックしますis here)。

^Hi there (.*)(?<! is here)$

編集

Alan Mooreが提案したように、パターンをさらに変更すると、パターン^Hi there (.*$)(?<! is here)のパフォーマンスが向上します。これは、キャプチャグループが後読みを試みる前に残りの文字列を飲み込んで、不要なバックトラックを回避するためです。

于 2012-08-01T14:39:22.863 に答える
3

「ishere」がどこかで発生するのを防ぎたいのか、それとも行の終わりで発生するのを防ぎたいのかは、例から完全には明らかではありません。どこにも発生しない場合は、次のことを試してください。

^Hi there ((?! is here).)*$

reFiddleの例

各文字の前に、次の文字が「ここにある」ではないことを確認します。

または、行の最後で発生した場合にのみ除外する場合は、Thorbearが提案したようにネガティブルックビハインドを使用できます。

^Hi there (.*)(?<! is here)$ 

式がすべての入力行に一致した理由は間違いありません。すべてに一致し、行の終わりのに「is here」が発生することはないため.*、先読みは常に真になります(何も存在しないため)。(?! is here)$

于 2012-08-01T14:35:26.050 に答える
1

正規表現の問題を解決する必要はありません。意図しない正規表現が一致するかどうかを確認するには、正規表現を使用するだけです。もちろん、これをすでに知っていて、先読み/後読みについて学びたいだけの場合は、この回答の残りを破棄できます。

正規表現を使用する場合、入力文字列を一致させたくありません。

badregex = (Hi there (.*)(is here))

これはあなたにマッチを与えるでしょう

Hi there, John is here

したがって、ロジックをアプリケーションレベルに配置することができます(正規表現のロジックは悪い悪いことです)。少しの擬似コード(私は今Javaを書きますが、あなたはその考えを理解します)

if (badregex.exactMatch(your_str))
   discardString();
   return;
if (goodregex.exactMatch(your_str))
   doStuff(your_str);
于 2012-08-01T14:39:44.657 に答える