32

これは文字列の例です。

123456#p654321

現在、私はこの試合を使用して、2つの異なるグループをキャプチャ123456して参加しています。654321

([0-9].*)#p([0-9].*)

しかし、時々、#p654321弦の一部がそこにないので、最初のグループだけをキャプチャしたいと思います。2番目のグループに追加して「オプション」にしようとしましたが、これは機能しますが、残りの文字列の最後に?が存在する場合に限ります。#p

この問題を解決するための最良の方法は何でしょうか?

4

2 に答える 2

55

キャプチャグループの#p外側にあるため、結果の必須部分になります。また、ドット文字(.)を不適切に使用しています。ドット(ほとんどの正規表現バリアント)は、どの文字とも一致します。次のように変更します。

([0-9]*)(?:#p([0-9]*))?

構文は、(?:)キャプチャしないグループを取得する方法です。次に、関心のある数字だけをキャプチャします。最後に、すべてをオプションにします。

また、ほとんどの正規表現バリアントには、\d数字の文字クラスがあります。したがって、さらに単純化することができます。

(\d*)(?:#p(\d*))?

別の人が指摘しているように、*演算子は潜在的にゼロ桁に一致する可能性があります。これを防ぐには、+代わりに演算子を使用してください。

(\d+)(?:#p(\d+))?
于 2012-09-17T00:05:05.303 に答える
6

の代わりにを使用したため、正規表現は実際には数字と一致しません。 これはあなたが望むものです(私は思う):*+

(\d+)(?:#p(\d+))?
于 2012-09-17T00:17:54.503 に答える