0

私のいくつかの入力文字列を考えてみましょう。

  1. http://local.app.com/local/frontend/v12/#/abcde/
  2. http://local.app.com/local/frontend/v12/#/abcde/!/fghij/
  3. http://local.app.com/local/frontend/v12/#/abcde/!/ghijk/!/klmno/

入力文字列 1 に対して正常に動作するこの正規表現を作成しました。

(?:([a-zA-Z0-9.://_]*)(/#/(?=([a-zA-Z0-9]{5})/)))

Output:
http://local.app.com/local/frontend/v12/#/,http://local.app.com/local/frontend/v12,/#/,abcde

しかし、入力文字列 1、2、3 の反復的な!/.../プレースホルダーをサポートするように拡張すると、機能せず、トークンではなく空の文字列が返されます。

(?:([a-zA-Z0-9.://_]*)(/#/(?=([a-zA-Z0-9]{5})/))(!/(?=([a-zA-Z0-9]{5})/))*)

Output:
http://local.app.com/local/frontend/v12/#/,http://local.app.com/local/frontend/v12,/#/,abcde,,
4

2 に答える 2

0

私の正規表現のスクリーンショット、コメントを参照

これにより、私のコメントと以前の発言が明確になることを願っています。

于 2012-09-13T16:40:13.223 に答える
0

?= は、実際には ?= の後に指定したものによって定義された位置をキャプチャします。ルックアラウンド (?=) の仕様に一致するものは (また) キャプチャしません。

試す

(.+? # (/[a-zA-Z0-9]{5}/) (!/([a-zA-Z0-9]{5})/)* )

(タイプミスがなければいいのですが、今はテストできません。)

これは完全な入力をキャプチャする必要がありますが、内部のさまざまなキャプチャにより、キャプチャされた「トークン」にアクセスできます。

さらに、内部のさまざまなキャプチャに名前を付けて、一致でそれらを簡単に識別できるようにすることができます。

(.+?#(/(?<tokenFirst>[a-zA-Z0-9]{5})/)(!/(?<tokenMore>[a-zA-Z0-9]{5})/)*)

成功

于 2012-09-13T14:25:40.780 に答える