我正在尝试解析这个正则表达式的示例。
我知道斜线可以用作转义字符。因此,如果您想搜索 ) 而不意味着分组,您将执行 \
然后是 )
为避免堆栈溢出正则表达式而拼写出来...
我也知道加号可以表示一个或多个前面的项。
但在下面的示例中,加号还是斜杠被转义了?似乎第一个斜杠允许您“转义”第二个斜杠,然后加号表示至少有一个前面的斜杠---但示例中说字符串中至少有两个 +...
这个正则表达式是什么意思?对于我来说,有太多新的东西需要解析了。
我正在尝试解析这个正则表达式的示例。
我知道斜线可以用作转义字符。因此,如果您想搜索 ) 而不意味着分组,您将执行 \
然后是 )
为避免堆栈溢出正则表达式而拼写出来...
我也知道加号可以表示一个或多个前面的项。
但在下面的示例中,加号还是斜杠被转义了?似乎第一个斜杠允许您“转义”第二个斜杠,然后加号表示至少有一个前面的斜杠---但示例中说字符串中至少有两个 +...
这个正则表达式是什么意思?对于我来说,有太多新的东西需要解析了。
两个都转义了!
\
被转义了,因为您正在使用的查询语言可能会将其用作转义字符(即用于转义引号)。因此,在正则表达式中,\\
被理解为单个\
,然后用于转义+
。该正则表达式表示一个单一的+
,后面跟着零个或多个+
。
它可能可以重写为\\++
,其中第二个+
实际上是正则表达式限定符。
'带有\'引号\'的字符串'
。 - dee-see'这是一个例子'
- 反斜杠被用来转义引号,以免它关闭字符串字面量。 - cmbuckley这个正则表达式实际上有两种不同的含义,取决于PostgreSQL版本和standard_conforming_strings
的值。
旧版本(在standard_conforming_strings
之前或默认关闭的版本)将把字符串解释为反斜杠转义字符串。因此,PostgreSQL会将\\+\\+*
转换为\+\+*
,即它会消耗一个转义级别。然后正则表达式将消耗剩余级别以转义加号,因此它们被解释为文字+而不是限定符。该正则表达式表示++后跟零个或多个其他字符。
新版本中,standard_conforming_strings
默认为on
,根据SQL标准,不会将反斜杠解码为转义字符。因此,您将运行正则表达式\\+\\+*
,它是一个或多个反斜杠,后跟一个或多个反斜杠,后跟...糟糕,星号没有前导字符是一个错误。
因此,我们知道您必须关闭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 '++%'
x_spam_level LIKE '%++%'
这就是当前所使用的正则表达式。PostgreSQL会将其内部转换为正则表达式,但您不必担心转义。
如果您想使用正则表达式并使其在所有版本中保持一致,请使用:
x_spam_level ~ E'\\+\\+*'
< p > E''
语法告诉 PostgreSQL 解码反斜杠转义字符,无论 standard_conforming_strings
设置如何。
standard_conforming_strings
参数的值也很重要。这可能是一个奇怪的表达式,用于查找以两个或更多\s(standard_conforming_strings=on
)或以++
开头(standard_conforming_strings=off
)的任何内容。 - Craig Ringer