你能解释一下这个正则表达式吗?

时间:2012-03-20 11:24:38

标签: regex oracle10g regular-language

我是正则表达的新手,在学习期间,我对某些基本内容感到困惑,请你解释一下这个表达式

查询

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

根据这些查询及其结果,我无法理解+和*之间的主要区别。

2 个答案:

答案 0 :(得分:7)

+ - 匹配1个或多个小写字母。防爆。括号中的匹配项:H [aving] [fun] [with]

* - 匹配0个或更多小写字母。例如:括号中的匹配(也是空字符串):[] H [aving] [] [fun] [] [with] []

答案 1 :(得分:2)

并非所有正则表达式引擎都以这种方式工作,但 Oracle正则表达式引擎将允许空匹配遵循非0宽度的匹配。但是,所有正则表达式引擎在字符串的开头匹配。

  • 使用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不匹配。
  • 我们位于第+ 1位,我们有一个匹配,可能的最大长度是5(aving)。
  • 我们位于第+ 6位,我们有一个长度为0. <space>的匹配。
  • 我们位于第+ 7位,我们有一个长度为3的匹配(fun
  • 我们位于第+ 10位,我们有一个长度为0. <space>的匹配。
  • 我们位于第+ 11位,我们有一个长度为4的匹配(with
  • 我们位于第+ 15位(结束),我们仍然有一个长度为0的匹配。