1

私の例の正規表現が私が望むように機能しない理由を理解しようとしています:

test-text: Filename: test myFile 123 .txt
pattern: (?<=Filename:.*?myFile)(.*?)(?=.txt)
Expected Result: 123

ここでは先読み/後読みが理想的ではないことは知っていますが、それは理解しようとする学習目的のためだけです。

では、なぜ機能し.*?myFileないのですか?削除するとパターンが一致しtest myFile 123ます。しかし、私はを探しFilename:、それからまでのすべてを除外しmyFile、最後の.txtステートメントの後にすべてを取りたいと思います。ここで何が欠けていますか?

4

3 に答える 3

1

後読みアサーションは固定長である必要があります。しかし、あなた.*?myFileはそうではありません。

使用している言語に応じて、次のことができます。

"(?<=Filename:)(.*?myFile\s*)([^\s]*?)(?=\s*.txt)"group(2)後読みと先読みが好きなら手に入れましょう。

また

"Filename:.*?myFile\s*([^\s]*)\s*\.txt"取得しますgroup(1)

于 2013-02-20T12:30:59.700 に答える
1

正規表現のマッチングは複雑であるため、可変長の後読みパターンはサポートされていません。その旨のエラーメッセージが表示されるはずです。これは単にPerlの正規表現エンジンの制限です。

これを可能にするやや似た機能があります:\K最終的な試合から左側のすべてを破棄します。したがって、このパターンはおそらく期待どおりに機能します。

/Filename:.*?myFile\K(.*?)(?=.txt)/

ただし、重複する一致を許可しないという点で、真の背後にあるものと同じではありません。

ちなみに、これはあなたが投稿した3番目の同様の質問です。あなたが提供した情報に基づくと、正解は「これにルックアラウンドを使用しないでください」です。それらを使用したい理由がある場合は、私たちがより良い支援を提供できるように、それを説明する必要があります。

于 2013-02-20T12:36:14.760 に答える
0

なぜそんなに複雑なのですか?

/myFile(.*?)\.txt$/

興味があるのがそれだけの場合は、グループをキャプチャするだけです。ルックアラウンドIMOは必要ありません。

編集:あなたの何が悪いのかについて:おそらくあなたの正規表現エンジンは可変長のルックアラウンドをサポートしていません。

于 2013-02-20T12:32:11.857 に答える