0

acプログラムに次のテキスト文字列と正規表現パターンがあります。

char text[] = "        identification     division. "; 
char pattern[] = "^(.*)(identification *division)(.*)$"; 

regexec()ライブラリ関数を使用すると、次の結果が得られました。

文字列:識別部門。
パターン:^(。*)(識別*分割)(。*)$
部分式の総数:3

OK、パターンが一致しました...

開始:0、終了:37、一致:識別部門。
部分式1開始:0、終了:8、一致:
部分式2開始:8、終了:35、一致:識別分割
部分式3開始:35、終了:37、一致:。

正規表現エンジンは貪欲に一致し、最初のキャプチャグループ(。*)は任意の数の文字(改行文字を除く)と一致するので、テキスト文字列の最後まで文字と一致しないのはなぜですか(最初の8つのスペースのみを一致させるのとは対照的に、「。」まで)?

各キャプチャグループを一致させる必要がありますか?

キャプチャグループがテキスト文字列と一致する方法に関する規則はありますか?

ありがとう。

4

2 に答える 2

1

正規表現は、貪欲になりすぎずに、可能な限り貪欲です。左のグループがあなたが期待するほど貪欲だったとしたら、「識別部門」に一致するグループは一致することができず、誤って拒否しtextました。これは明らかに言語でした。

于 2012-05-28T13:31:30.927 に答える
0

あなたが言ったように、貪欲なグループ(。*)が文字列全体を消費した場合、残りの正規表現には一致するものがなく、正規表現が文字列と一致しません。したがって、はい、各キャプチャグループ(およびその他のパタ​​ーンパーツ)を一致させる必要があります。これは、正規表現で指定したものとまったく同じです。

代わりに次の文字列を試して、気が進まない最初のグループと貪欲な最初のグループの両方でコードを実行すると、違いがわかります。

char text[] = "    identification  division    identification     division. ";
于 2012-05-28T13:31:16.073 に答える