2

私 は 正規 表現 に 慣れ て い ませ ん .

クエリ

SELECT REGEXP_REPLACE('Having fun with', '([a-z])+', 'A') FROM dual;

結果:

HA A A

クエリ

SELECT REGEXP_REPLACE('Having fun with', '([a-z])*', 'A') FROM dual;

結果:

AHAA AA AA

これらのクエリとその結果によると、+ と * の主な違いを理解できません。

4

2 に答える 2

7

+ - 1 つ以上の小文字に一致します。元。括弧内の一致: H[aving] [fun] [with]

* - 0 個以上の小文字に一致します。例: 括弧内の一致 (空の文字列も): []H[aving][] [fun][] [with][]

于 2012-03-20T11:30:31.253 に答える
2

すべての正規表現エンジンがそのように機能するわけではありませんが、Oracle 正規表現エンジンでは、非 0-width の一致の後に空の一致が続くことを許可します。ただし、すべての正規表現エンジンは文字列の先頭で一致する必要があります。

  • ==>を使用して'noignorecase'、vim を使用します。:s/[a-z]*/A/gAHA A A
  • Perl を使用すると、my $in = 'Having fun with'; $in =~ s/[a-z]*/A/g;==> AHAA AA AA.

*は貪欲で、 と同様にできるだけ多くの項目に一致しようとします+*、0 回の一致 (つまり、空の文字列) を許可します。

マシンの状態は次のとおりです。

  • 文字列の先頭にあり、一致があります。可能な最大長は 0Hです。一致しません。
  • 位置 s+1 にあり、一致があります。可能な最大の長さは 5 ( aving) です。
  • 位置 s+6 にあり、長さ 0 の<space>一致があります。一致しません。
  • 位置 s+7 にあり、長さ 3 の一致があります ( fun)
  • 位置 s+10 にあり、長さ 0 の<space>一致があります。一致しません。
  • 位置 s+11 にあり、長さ 4 の一致があります ( with)
  • s+15 (最後) の位置にいますが、まだ長さ 0 の一致があります。
于 2012-03-20T11:35:10.633 に答える