这个正则表达式中\\ +的含义是什么?

时间:2013-12-11 19:29:15

标签: regex postgresql

我正在尝试解析这个示例正则表达式。

我知道斜杠可以用作转义字符。因此,如果你想搜索)而不暗示分组,你可以\然后) 拼写这个以避免堆栈溢出正则表达式...

我也知道加号可以表示前面一项或多项。

但是在下面的示例中,加号或斜线是否被转义?看起来第一个斜杠允许你“逃避”第二个斜杠然后加号表示至少有一个先前的斜杠---但是例子说字符串中至少有两个+ ...

这个正则表达式意味着什么?我要解析它的新事物太多了。

enter image description here

2 个答案:

答案 0 :(得分:9)

  

但是在下面的示例中,加号或斜线是否被转义?

两个!

\被转义,因为您使用的查询语言可能将其用作转义字符本身(即转义引号)。因此,\\被理解为正则表达式中的单个\,然后用于转义+。正则表达式表示单个+后跟零或多个+

它可能被重写为\\++,其中第二个+实际上是正则表达式量词。

答案 1 :(得分:2)

regexp实际上可能意味着两种不同的东西,具体取决于PostgreSQL版本和standard_conforming_strings的值。

旧版本(在standard_conforming_strings之前或默认为关闭的版本)会将字符串解释为反斜杠转义字符串。所以PostgreSQL会将\\+\\+*转换为\+\+*,即它会消耗一定程度的转义。然后正则表达式将使用剩余的级别来逃避加号,因此它们被解释为文字+不是限定符。该正则表达式表示 ++后跟零个或多个其他字符

根据SQL标准,<{1}}默认为standard_conforming_strings的较新版本将不会将反斜杠解码为转义符。所以你将运行正则表达式on,它是一个或多个反斜杠,后跟一个或多个反斜杠,然后是... oops,没有前面字符的星号是错误

所以我们知道你必须关闭\\+\\+*,因为查询将无法在新版本上编译正则表达式。

standard_conforming_strings

稍后你会遇到这个问题,所以我建议你在升级之前处理它。

假设regress=> SELECT 'blah' ~ '\\+\\+*'; ERROR: invalid regular expression: quantifier operand invalid postgres=> SHOW standard_conforming_strings; standard_conforming_strings ----------------------------- on (1 row) 字段始终以正则表达式未检查的优点开头,那么该代码可能更好地写为:

x_spam_level

如果不是以加号开头,请使用:

x_spam_level LIKE '++%'

这是当前正则表达式正在做的事情。 PostgreSQL会在内部将其转换为正则表达式,但您不必担心转义。

如果您想使用正则表达式并使其在所有版本中表现得一致,请使用:

x_spam_level LIKE '%++%'

x_spam_level ~ E'\\+\\+*' 语法告诉PostgreSQL解码反斜杠转义,无论E''设置如何。