Regex 在postgreSQL中,为什么对\s和\w的处理不同?
下面是一个让我困惑的例子:Regex 在postgreSQL中,为什么对\s和\w的处理不同?,regex,postgresql,Regex,Postgresql,下面是一个让我困惑的例子: select ' w' ~ '^\s\w$'; 这会导致“假”,但似乎应该是真的 select ' w' ~ '^\\s\w*$'; 这会导致“正确”,但: 为什么\s需要额外的反斜杠 如果确实需要,为什么不需要额外的反斜杠 谢谢你的帮助 有些语言使用反斜杠作为转义字符。正则表达式可以做到这一点,类似C的语言可以做到这一点,而一些罕见的、奇怪的SQL方言也可以做到这一点。PostgresSQL将反斜杠转义转换为字符串值,然后将该字符串值提供给正则表达式解析器,正则
select ' w' ~ '^\s\w$';
这会导致“假”,但似乎应该是真的
select ' w' ~ '^\\s\w*$';
这会导致“正确”,但:
谢谢你的帮助 有些语言使用反斜杠作为转义字符。正则表达式可以做到这一点,类似C的语言可以做到这一点,而一些罕见的、奇怪的SQL方言也可以做到这一点。PostgresSQL将反斜杠转义转换为字符串值,然后将该字符串值提供给正则表达式解析器,正则表达式解析器将再次转换第一次转换后保留下来的任何反斜杠(如果有的话)。在你的第一个正则表达式中,没有人这样做 例如,在字符串文本或正则表达式中,
\n
并不表示反斜杠后跟小写的n。意思是换行。根据语言的不同,反斜杠后跟小写s表示只有小写s,或者什么都没有。在PostgresSQL中,字符串文字中的无效转义序列转换为转义字符:'\w'
转换为'w'
。正则表达式解析器看到的所有代码都是w
。碰巧,您在匹配的字符串中使用了字母w
。它与左值中的w
不匹配,因为它是一个单词字符;它匹配它是因为它是小写的w
。将其更改为小写x
,它将停止匹配
如果要在字符串文字中添加反斜杠,则需要使用另一个反斜杠对其进行转义:“\\\”
。这就是为什么第二个正则表达式中的\\s
起作用的原因。如果要将任何单词字符与之匹配,请在\w
中添加第二个反斜杠
这是一种可怕的疼痛。这就是为什么JavaScript、Perl和其他语言对正则表达式文本(如
/\s\w/
)有特殊约定的原因,也是为什么C#程序员使用@“string literal”
功能在他们打算用作正则表达式的字符串中禁用反斜杠转义的原因 我认为你的测试方法是错误的,因为我得到的结果与你得到的相反
select ' w' ~ '^\s\w$';
在我的情况下返回1
。这实际上是有意义的,因为它匹配文本开头的空格,后面是结尾的字母
select ' w' ~ '^\\s\w*$';
正在返回0
,这也很有意义。在这里,您试图在文本开头匹配一个反斜杠,后跟一个s
,然后是任意数量的字母、数字或下划线
与第二个正则表达式匹配的一段文本是:'\sw'
检查小提琴。字符串常量首先被解析并解释为字符串,包括转义字符。未识别序列的转义由不同的解析器进行不同的处理,但通常,除了错误之外,最常见的行为是忽略反斜杠 在第一个示例中,右侧字符串常量首先被解释为
“^sw$”
,其中\s
和\w
都是无法识别的字符串转义序列
在第二个示例中,右侧常量被解释为'^\sw*$'
,其中\\s
转义\
解释字符串后,它们将作为正则表达式应用,
'^\sw*$'
匹配'w'
,而'^sw$'
不匹配。您的Postgres版本和设置?谢谢!我希望我在测试中没有使用字母“w”,这会造成一些混乱,但我很高兴了解到在PostgreSQL中如何解析字符串文字。@user3062144不客气。按照网站的工作方式,如果你得到的答案回答了你提出的问题,你应该点击答案旁边的复选标记。