这个正则表达式中的 \\+ 是什么意思?

4

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

我知道斜线可以用作转义字符。因此,如果您想搜索 ) 而不意味着分组,您将执行 \ 然后是 ) 为避免堆栈溢出正则表达式而拼写出来...

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

但在下面的示例中,加号还是斜杠被转义了?似乎第一个斜杠允许您“转义”第二个斜杠,然后加号表示至少有一个前面的斜杠---但示例中说字符串中至少有两个 +...

这个正则表达式是什么意思?对于我来说,有太多新的东西需要解析了。

enter image description here


1
我已经添加了 [tag:postgresql] 标签,因为正则表达式看起来可能是这样的。如果有误,你可以更改标签。 - cmbuckley
你的PostgreSQL版本很重要,standard_conforming_strings参数的值也很重要。这可能是一个奇怪的表达式,用于查找以两个或更多\s( standard_conforming_strings=on )或以 ++ 开头( standard_conforming_strings=off )的任何内容。 - Craig Ringer
2个回答

10
但是在下面的示例中,加号还是斜杠被转义了?

两个都转义了!

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

它可能可以重写为\\++,其中第二个+实际上是正则表达式限定符。


文档(假设为PostgreSQL):http://www.postgresql.org/docs/8.1/static/functions-matching.html#POSIX-ESCAPE-SEQUENCES - cmbuckley
如果您想在查询中使用带引号的字符串,可以通过以下方式对其进行转义:'带有\'引号\'的字符串' - dee-see
@akh2103 '这是一个例子' - 反斜杠被用来转义引号,以免它关闭字符串字面量。 - cmbuckley
@Vache 我了解你的评论。'使用'斜杠'来包含引号'。但是这个例子似乎没有包含引号。这里的意思是第一个斜杠是postgres的转义字符,它允许你在查询中包含第二个\吗?(就像你在查询中使用'来包含一个'一样)。 - bernie2436
1
@akh2103 没错。通过使用 \,您告诉PostgreSQL您不是在使用 \ 进行转义,而是实际上意味着 \。然后,正则表达式引擎使用它来转义“+”。 - dee-see
显示剩余3条评论

2

这个正则表达式实际上有两种不同的含义,取决于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 设置如何。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接