gpt4 book ai didi

字符串的正则表达式可选择用引号括起来

转载 作者:行者123 更新时间:2023-12-02 01:08:47 26 4
gpt4 key购买 nike

我正在尝试构建一个匹配字符串的正则表达式,这些字符串要么被引号括起来,要么两边都没有引号。此外,正则表达式必须匹配的字符串中间可能有引号。这是我目前努力的结果:

^("?+)(.*[^"])(\1)$

它适用于在开头和结尾都有引号的字符串,任何一侧都没有引号或仅在开头有引号:

$ echo '"blah "blah" blah"' | perl -ne 'if(/^("?+)(.*[^"])(\1)$/){print "$1\n$2\n$3"}'
"
blah "blah" blah
"
$ echo 'blah "blah" blah' | perl -ne 'if(/^("?+)(.*[^"])(\1)$/){print "$1\n$2\n$3"}'

blah "blah" blah

$ echo '"blah "blah" blah' | perl -ne 'if(/^("?+)(.*[^"])(\1)$/){print "$1\n$2\n$3"}'

但它匹配仅在末尾有引号的字符串:

$ echo 'blah "blah" blah"' | perl -ne 'if(/^("?+)(.*[^"])(\1)$/){print "$1\n$2\n$3"}'

blah "blah" blah"

知道正则表达式有什么问题以及如何解决吗?

最佳答案

在你的最后一个例子中,("?+) 匹配空字符串。(\1) 实际上变成了一个空操作:它也匹配一个空字符串。

这给我们留下了 ^(.*[^"])$。这是匹配的,因为您的输入字符串末尾有一个非 " 字符:一个换行符("\n").

您可以通过在运行正则表达式之前删除换行符来解决此问题 (perl -ne 'chomp; ...')。


作为旁注,您可能希望将正则表达式的中间部分设为可选。否则它不会匹配空字符串或由两个引号组成的字符串 ("")。

关于字符串的正则表达式可选择用引号括起来,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46236949/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com