Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Regex 在postgreSQL中,为什么对\s和\w的处理不同?_Regex_Postgresql - Fatal编程技术网

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*$';
这会导致“正确”,但:

  • 为什么\s需要额外的反斜杠
  • 如果确实需要,为什么不需要额外的反斜杠

  • 谢谢你的帮助

    有些语言使用反斜杠作为转义字符。正则表达式可以做到这一点,类似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不客气。按照网站的工作方式,如果你得到的答案回答了你提出的问题,你应该点击答案旁边的复选标记。