5

正規表現パターン (Java) を使用して、3 桁のシーケンスと 3 桁のみが連続するものを見つけようとしています。4 桁が一致しません、2 桁が一致しません。

私にとって明らかなパターンは次のとおりです。

"\b(\d{3})\b"

これは、次のような多くのソース文字列のケースと一致します。

">123<"
" 123-"
"123"

ただし、c/1 境界と 3/d 境界は、\b クラスが期待する「単語境界」の一致としてカウントされないため、「abc123def」のソース文字列とは一致しません。

解決策として、非数字 (\D) と単語境界 (\b) の両方を含む文字クラスを追加することを期待していました。しかし、それは違法な構文のようです。

"[\b\D](\d{3})[\b\D]"

次のようなソース文字列の状況で「123」を抽出する式として何を使用できるか知っている人はいますか?

"abc123def"

助けていただければ幸いです。はい、Java では \b のようなコードを \b にダブルエスケープする必要があることは理解していますが、それは私の問題ではなく、これを Java 関係者に限定したくありませんでした。

4

2 に答える 2

4

ルックアラウンドはこの問題を解決できますが、すべての正規表現エンジンがルックアラウンドを完全にサポートしているわけではないため、個人的には避けるようにしています。さらに、そもそもこの問題が複雑であり、ルックアラウンドを使用する価値があるとは言えません。

これを一致させることができます:(?:\b|\D)(\d{3})(?:\b|\D)

次に戻ります:\1

または、置換を実行していて、文字列全体を一致させる必要がある場合:(?:\b|\D)+(\d{3})(?:\b|\D)+

次に、次のものに置き換えます。\1

補足として\b、文字クラスの一部として機能しなかった理由は、括弧内では、[\b]実際にはまったく異なる意味を持っていたためです。単語の境界ではなく、バックスペースを参照しています。

これが実用的なデモです。

于 2014-04-10T17:08:20.270 に答える