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 的匹配。但是,所有正则表达式引擎都应该在字符串的开头匹配。

  • 使用 vim,与'noignorecase', :s/[a-z]*/A/g==> AHA A A
  • 使用 Perl,my $in = 'Having fun with'; $in =~ s/[a-z]*/A/g;==> AHAA AA AA

*是贪婪的,会尝试匹配尽可能多的项目,就像 一样+,但*允许匹配 0 次(即空字符串)。

机器状态为:

  • 我们在字符串的开头,我们有一个匹配,可能的最大长度为 0。H不匹配。
  • 我们在位置 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 回答