我正在尝试解析这个示例正则表达式。
我知道斜杠可以用作转义字符。因此,如果你想搜索)而不暗示分组,你可以\
然后)
拼写这个以避免堆栈溢出正则表达式...
我也知道加号可以表示前面一项或多项。
但是在下面的示例中,加号或斜线是否被转义?看起来第一个斜杠允许你“逃避”第二个斜杠然后加号表示至少有一个先前的斜杠---但是例子说字符串中至少有两个+ ...
这个正则表达式意味着什么?我要解析它的新事物太多了。
答案 0 :(得分:9)
但是在下面的示例中,加号或斜线是否被转义?
两个!
\
被转义,因为您使用的查询语言可能将其用作转义字符本身(即转义引号)。因此,\\
被理解为正则表达式中的单个\
,然后用于转义+
。正则表达式表示单个+
后跟零或多个+
。
它可能被重写为\\++
,其中第二个+
实际上是正则表达式量词。
答案 1 :(得分:2)
regexp实际上可能意味着两种不同的东西,具体取决于PostgreSQL版本和standard_conforming_strings
的值。
旧版本(在standard_conforming_strings
之前或默认为关闭的版本)会将字符串解释为反斜杠转义字符串。所以PostgreSQL会将\\+\\+*
转换为\+\+*
,即它会消耗一定程度的转义。然后正则表达式将使用剩余的级别来逃避加号,因此它们被解释为文字+不是限定符。该正则表达式表示 ++后跟零个或多个其他字符。
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''
设置如何。