regex - 如何匹配单引号字符串中的双反斜杠?

标签 regex perl

我需要区分带有单反斜杠和双反斜杠的字符串。 Perl 对它们一视同仁:

print "\n" . '\qqq\www\eee\rrr';
print "\n" . '\\qqq\www\eee\rrr';

将给出相同的结果:

\qqq\www\eee\rrr
\qqq\www\eee\rrr

更重要的是,接下来的调用:

print "\n" . leadingBackSlash('\qqq\www\eee\rrr');
print "\n" . leadingBackSlash('\\qqq\www\eee\rrr');
print "\n" . leadingBackSlash('\\\qqq\www\eee\rrr');
print "\n" . leadingBackSlash('\\\\qqq\www\eee\rrr');

函数:

sub leadingBackSlash {
    $_ = shift;
    print "\n$_";
    print "\n" . length($_);

    if( m/^\\\\/) {
        print "\ndouble backslash is matched";
    }

    if( m/^\\/) {
        print "\nsingle backslash is matched";
    }
}

将产生结果:

\qqq\www\eee\rrr
16
single backslash is matched

\qqq\www\eee\rrr
16
single backslash is matched

\\qqq\www\eee\rrr
17
double backslash is matched
single backslash is matched

\\qqq\www\eee\rrr
17
double backslash is matched
single backslash is matched

即它匹配双反斜杠作为单个反斜杠。

你能帮我用正则表达式来匹配双反斜杠而不是单反斜杠吗?

最佳答案

在 Perl 中,单引号字符串只有两个反斜杠转义:

  1. 分隔符,例如“约翰的车”
  2. 反斜杠。当我们想要尾随反斜杠时,这是必要的:'foo\bar\\'

所有其他反斜杠都是文字。不幸的是,对于 n 实际反斜杠,必须在单引号字符串文字中使用 2n-12n 反斜杠.

正则表达式与双引号字符串具有相同的反斜杠语义。

您已经有一个匹配前导双反斜杠的正则表达式:/^\\\\/。这显然不会匹配单个前导反斜杠。

如果你想匹配一个反斜杠,并且只匹配一个反斜杠,只需确保第一个反斜杠后面没有跟另一个反斜杠。这使用了否定前瞻:/^\\(?!\\)/

关于regex - 如何匹配单引号字符串中的双反斜杠?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17845606/

相关文章:

mod_perl 下的 MySQL 驱动程序段错误 - 在哪里寻找问题

mysql - 使用perl将特殊字符插入mysql

regex - perl 正则表达式不是字符串的开头

php - 8 到 10 个字母单词的正则表达式

.net - 仅当组存在时才匹配组内的组

python正则表达式将括号限制为一次

ruby - 正则表达式从字符串中选择周围没有任何空格的所有逗号

c# - 用括号分割字符串的正则表达式

perl - 如何清理 Perl 中打开文件的输入

Perl,如何使用 "print"打印数字总和的评估