2010-01-11 156 views
3

我正在努力学习Oracle中的正则表达式(相当于我第一次尝试使用RegEx进行任何操作)。关于Oracle中正则表达式的查询

^是什么意思在开头? 说明文档中提到

Use the caret and dollar sign to define patterns that match the start or end of a string. 
^ defines that start of a string or column 1 of the string. 

因此,通过使用'^[*est]'为图案,我的理解是,match anything which has -est as its ending

然而,当我尝试过了,

SQL> select 1 from dual where regexp_like('test','^[*est]'); 

     1 
---------- 
     1 

SQL> select 1 from dual where regexp_like('best','^[*est]'); 

no rows selected 

SQL> select 1 from dual where regexp_like('fest','^[*est]'); 

no rows selected 

卸下^然而,我们得到

SQL> select 1 from dual where regexp_like('fest','[*est]'); 

     1 
---------- 
     1 

SQL> select 1 from dual where regexp_like('best','[*est]'); 

     1 
---------- 
     1 

SQL> select 1 from dual where regexp_like('test','^[*est]'); 

     1 
---------- 
     1 

为什么会这样呢?为什么在第一种情况下,匹配发生在“测试”而不是其他人?

+1

很好的参考:http://www.regular-expressions.info/ – 2010-01-11 16:42:25

+0

@OMG小马 - 感谢您的链接。 – Sathya 2010-01-12 12:26:50

回答

5
select 1 from dual where regexp_like('best','^[*est]'); 

[]在正则表达式的意思是“列出的任何字符”

[],星号失去了它的特殊含义,意思正好星号。

的正则表达式上述匹配开头的任何字符串*est(任何以下的字符串的开始列出的字符)。

要选择词语上-est结束,使用:

select 1 from dual where regexp_like('nest','est$') 

这意味着“后面的字符串的结束的字符串est$)”

+0

所以我认为它是第一个查询的意思,匹配以'e','s','t','*'开始的任何字符串,而第二个查询意味着匹配任何具有'e','s'的字符串, 't','*'? – Sathya 2010-01-12 12:26:04

+0

第二个查询将匹配以'est'结尾的任何字符串(按该顺序)。它会匹配'nest'和'best',但不匹配'nets'或'bets'。 – Quassnoi 2010-01-12 12:35:32

+0

为了清楚起见,通过第二个查询,我的意思是'regexp_like('fest','[* est]')' - 你说'[]'在regexps中的意思是“任何列出的字符” - 所以我想确认这意味着匹配任何具有'e','s','t','*'的字符串。 对不起,如果我造成任何混淆 – Sathya 2010-01-12 13:34:32

2

除非Oracle中的正则表达式语法是非常不同的从所有其他正则表达式实现,然后你porbably想要将您的[]更改为()[est]匹配“e”,“s”或“t”。另一方面,(est)与“est”匹配。