Perl:为什么带字符的正则表达式双反斜杠不能识别带字符的单反斜杠字符串?[关闭]

Perl: Why Regex double backslash with character does not recognize string with single backslash with character? [closed]

提问人:giordano 提问时间:9/17/2023 最后编辑:AztecCodesgiordano 更新时间:9/17/2023 访问量:57

问:


编辑问题以包括所需的行为、特定问题或错误以及重现问题所需的最短代码。这将帮助其他人回答这个问题。

2个月前关闭。

为什么这不给 1?Regex

>perl -e "$x = 'abcd\\e'; print \"$x\n\";  ($x =~ '\\e') ? print 1:print 0";
abcd\e
0
正则表达式 Perl 转义

评论

0赞 Shawn 9/17/2023
这给出了一个语法错误(大概是因为我的 shell 没有一个名为 defined 的变量,所以它被一个空字符串替换了)x
1赞 Shawn 9/17/2023
不过,比较和对比你最好重新措辞你的问题,将代码放在脚本文件中,而不是命令行中,以避免 shell 插值和转义。perl -E '$x = q{abcd\e}; say $x; ($x =~ q{\\\e}) ? say 1 : say 0'
1赞 Håkon Hægland 9/17/2023
如果从 shell 运行它,则需要更多反斜杠。例如:对我有用perl -e "\$x = 'abcd\\e'; print \"\$x\n\"; (\$x =~ '\\\\\\e') ? print 1:print 0";
0赞 giordano 9/17/2023
@Shawn和@Hakon:好的,你们俩都回答了我的问题。这是一个 shell 问题。我编写了一个脚本并运行您的代码(或“\\\e”),它给了我 1。但为什么是 3 个反斜杠,而不仅仅是两个?为什么对于这样一个简单的问题来说,解决方案似乎并不那么微不足道?q{\\\e}
0赞 Håkon Hægland 9/17/2023
@giordano “但为什么是 3 个反斜杠,而不仅仅是两个?”在两个连续的反斜杠内变成一个反斜杠,见 perldoc.perl.org/perlop#Quote-Like-Operatorsq{}

答:

1赞 AztecCodes 9/17/2023 #1

正则表达式不匹配,因为试图找到一个文字反斜杠,后跟 但是,在您的字符串中,之前有一个实际的反斜杠 要解决此问题,请在正则表达式中使用单个反斜杠,如下所示:($x =~ '\e')'\e''e.'$x ('abcd\e')'e.'

固定正则表达式:

perl -e "$x = 'abcd\\e'; print \"$x\n\";  ($x =~ '\\\\e') ? print 1 : print 0";

通过此调整,确实会在字符串中找到反斜杠后跟,并且您的脚本将生成 的预期结果 。Regex'e'1

评论

0赞 giordano 9/17/2023
@AzteCodes 什么是实际的反斜杠?
0赞 AztecCodes 9/17/2023
@giordano 它不是字面上的反斜杠。它被读取为实际的反斜杠符号。
0赞 giordano 9/17/2023
然而,相当令人困惑。'abcd\\e' =~ '\\\e' 给出 1,也给出 'abcd\e' =~ '\\\e'。并且: 'abcd\e' eq 'abcd\\e' 为 true。