4

正規表現で非キャプチャ グループを理解しようとしています。

次の入力がある場合:

He hit the ball.  Then he ran.  The crowd was cheering!  How did he feel?  I felt so energized!

各文の最初の単語を抽出したい場合は、次の一致パターンを使用しようとしました。

^(\w+\b.*?)|[\.!\?]\s+(\w+)

これにより、目的の出力がサブマッチに配置されます。

Match   $1
He      He  
. Then  Then
. The   The
! How   How
? I     I

しかし、私は、非捕獲グループを使用して、それらを試合に戻すことができるはずだと考えていました.

私は試した:

^(?:\w+\b.*?)|(?:[\.!\?]\s+)(\w+)

そしてそれは以下をもたらしました:

Match   $1
He  
. Then  Then
. The   The
! How   How
? I     I

^(?:\w+\b.*?)|(?:[.!\?]\s+)\w+

得られた:

Match
He
. Then
. The
! How
? I

私は何が欠けていますか?

(RegExLib.com を使用して正規表現をテストしていますが、VBA に転送します)。

4

3 に答える 3

6

文字列 "foo" に対する簡単な例:

(f)(o+)

$1= 'f' および$2= 'oo'を生成します。

(?:f)(o+)

ここで$1= 'oo' は、最初に一致するグループをキャプチャしないように明示的に指定したためです。そして、2 番目に一致するグループはありません。

あなたのシナリオでは、これはほぼ正しいと感じています:

(?:(\w+).*?[\.\?!] {2}?)

最も外側のグループは非キャプチャ グループであり、内側のグループ (文の最初の単語) はキャプチャされていることに注意してください。

于 2013-01-09T19:03:55.757 に答える
1

以下は、境界条件の非キャプチャ グループを構築し、その後の単語をキャプチャ グループでキャプチャします。

(?:^|[.?!]\s*)(\w+)

正規表現をテキストにどのように適用するかという質問からは明らかではありませんが、通常の「一致がなくなるまで別のものを引き出す」ループは機能するはずです。

于 2013-01-09T20:14:47.927 に答える