2

この式で数字 (最初の数字より少ない数字) を見つけようとしましたが、最後の数字でしか機能しません...繰り返しグループをキャプチャする必要があり、キャプチャされたグループを繰り返さない必要があることは知っていますが、それがどのようになっているのかわかりません。

登録:

(\d*)[a-zA-Z]+\d+(?:\.(\d*))*\.[a-zA-Z]+

1212asdfasdfdasf101.102.103.asdsadasdasd

1213asdfasdfdasf104.105.106.asdsadasdasd

キャプチャ 102 と 103、105、106 が必要ですが、1212 と 1213 も必要です。どのように??ありがとう!

4

1 に答える 1

2

答えは、使用している言語によって異なります。

正規表現のほとんどのフレーバーには、「単純な」答えはありません...たとえば、次のようなことができると思うかもしれません:

^(?:.*?(\d+))+

...これにより、数字のグループごとに新しいキャプチャ グループが作成されます (希望する場合)。

ただし、(たとえば)Javaドキュメントをざっと見てみると、次のように表示されます。

キャプチャ グループは、左かっこを左から右に数えることによって番号が付けられます。

つまり、入力した括弧のペアの数によって指定されるように、固定数があります。したがって、ほとんどの言語では、この作業を行うために単純な正規表現の照合以上のことを行う必要があります。

つまり、次のような恐ろしいことを行うことで、正規表現の一般化を減らすことができない限り (そして、はるかに醜い)、次のようになります。

^(?:.*?(\d+))?(?:.*?(\d+))?(?:.*?(\d+))?(?:.*?(\d+))?

ただし、 .NETまたは Perl 6を使用して、この正規表現一致を適切に実行できます。

于 2013-07-02T14:20:43.660 に答える