1

だから私はこのようなものを持っています:

\b(0?[1-9]|[1-2][0-9]|3[0-6])\b

これは、一致する数字 1 ~ 36 に対してのみ正常に機能します。しかし、一致しない S36 のようなものを取得する可能性があります。数値の両側にきれいな単語境界があるとは想定できません。

1 から 36 までのいずれかの数字以外の数字と一致するようにしたいと思います。

私はこのようなものがうまくいくと思っていましたが、うまくいきません:

(?<=\D)(0?[1-9]|[1-2][0-9]|3[0-6])(?=\D)

数字の前に数字以外があることを確認するために最初に肯定的な後読みが行われ、数字の後に同じことが当てはまることを確認するために数字の後に肯定的な先読みが行われるはずです。

これを行う正しい方法は何ですか?

4

2 に答える 2

2

エンジンが後読み/先読みをサポートしていない場合でも、数字以外を含む全体を照合して、関心のあるキャプチャを選択できます。

(?:^|[^1-9])(0?[1-9]|[1-2][0-9]|3[0-6])(?:$|[^1-9])

この例では、結果はキャプチャ 1 になります (「外側」の一致は非キャプチャ グループにあります)。

.NET では、後読みと先読みが完全にサポートされているため、次のように動作することに注意してください。

(?<![0-9])(?:0?[1-9]|[1-2][0-9]|3[0-6])(?![0-9])

これは、肯定的なルックアラウンドではなく、否定的なルックアラウンドを使用します。それ以外の場合、文字列の先頭または末尾にある数字は一致しません。これは、文字のない場所に数字以外の文字が必要になり、不一致につながるためです。

于 2012-12-30T16:10:13.050 に答える
1

最初と最後に [^0-9] を使用するだけで、適切なキャプチャ グループ (この場合は 2 番目) を見て番号を取得できます。

(^|[^0-9])(0?[1-9]|[1-2][0-9]|3[0-6])($|[^0-9])
于 2012-12-30T16:10:44.710 に答える