3

ここに私の正規表現パターンがあります:[Ss]ection\s\d+(?![a-zA-z])(?!</ref>)

たとえば、次のように一致する必要があります:section 5またはsection 50

たとえば、一致しないsection 5Aでください: or section 5</ref>or section 5A</ref>orsection 50A

問題は、実際にはそれらが間違って一致することです: http://regexr.com?33ien

パターンの何が問題なのかわかりませんが...

4

3 に答える 3

8

多分試してみてください[Ss]ection\s\d++(?![a-zA-z])(?!</ref>)。++は所有格の数量詞です。この数量詞は、一致した文字列のフラグメントが正規表現の後半で使用されないようにブロックすることを除いて、貪欲な数量詞に似ています。

System.out.println("ababab".matches("(ab)++ab")); 
// prints false since last "ab" is possessed by (ab)++ 
于 2013-01-28T12:28:21.740 に答える
2

一致は間違っていません。正規表現では、「セクション」の後に1つ以上の数字が続き、その後にテキストまたは「」が続きません。

それは本当ですsection 50A

section 50Aand thats は否定的な先読みではありません。

次のようなことができます:

[Ss]ection\s\d+(?![a-zA-Z0-9])(?!</ref>)
于 2013-01-28T12:24:18.660 に答える
1

これはうまくいくはずです:

[Ss]ection\s\d+(?!\d)(?![a-zA-z])(?!</ref>)

Java正規表現の否定先読みアサーションを使用したスト​​レンジネスでの正規表現先読みについての私たちの考え方の問題を説明しましたが、ここにも当てはまります。

ここでの状況は少し異なります: 否定的な先読みは、一致させたくない場合でも一致します。これは、式全体の一致に役立つ場合、マッチャーは事前先読み部分の短い一致を受け入れる傾向があるためです。そのため、先読みを使用する場合は、入力境界のアイデアを持っていることが重要です。それは、単語境界、アンカー$、または次のテキストに関するアサーション (提案されたソリューションの数字を見ない) などです。

于 2013-01-28T12:23:46.977 に答える