匹配包含“\”字符

时间:2016-12-11 13:53:01

标签: regex perl

我正在尝试匹配包含\字符的字符串,但它无法按预期工作。

例如:

if ("\\" =~ "\\") {
    print "true\n";
}

在这种情况下,它会按预期工作并打印true

但是如果我在\字符之前和之后添加更多字符,则条件变为false并且不会在标准输出上打印任何内容

if ("DATA\\DATA" =~ "DATA\\DATA") {
    print "true\n";
}

如果我将字符放在if字符(\DATA\\)的一侧,\\DATA条件仍然有效。

3 个答案:

答案 0 :(得分:7)

当我尝试你的第一个代码时,我实际上得到了这个错误:

Trailing \ in regex m/\/ at foo.pl line 1.

这是一个关于问题是什么的暗示。

=~运算符可以采用多种形式。通常,$str =~ tr/.../.../用于音译,$str =~ s/.../.../用于正则表达式搜索/替换,或$str =~ m/.../用于普通正则表达式匹配。

您的代码不使用这些代码。相反,它使用通用$str =~ EXPR形式,将EXPR评估为字符串,然后将该字符串的内容解释为正则表达式(并与m//执行正常匹配)。

在您的情况下(代码1),结果字符串由一个反斜杠组成:\。这不是一个有效的正则表达式,因为在正则表达式中,反斜杠必须后跟一些东西。这就是出现上述错误的原因。

在您的其他示例(代码2)中,结果字符串为DATA\DATA。当被解释为正则表达式时,它匹配DATA,后跟非数字字符(这是\D在正则表达式中的含义),后跟ATA

要解决此问题,您可以将所有反斜杠加倍("DATA\\\\DATA" - 字符串处理将其转换为DATA\\DATA,这是匹配文字字符串DATA\DATA)的正则表达式,或者只是首先不要使用字符串:

if ("DATA\\DATA" =~ m/DATA\\DATA/) {
    print "yay\n";
}

当你使用m//时,Perl知道你正在写一个正则表达式,所以你不必在正则表达式转义之上处理字符串转义。

答案 1 :(得分:3)

来自perlop

  

二进制“=〜”将标量表达式绑定到模式匹配。 ......正确的论点是搜索模式,替换或音译。 ...如果正确的参数是表达式而不是搜索模式,替换或音译,则在运行时将其解释为搜索模式。请注意,这意味着它的内容将被插值两次。

Option Explicit Private Sub ReadRunTimeTextBox() Dim ctrl As Control Dim absorb_text As String ' loop through all control in user form For Each ctrl In Me.Controls ' check if control is type TextBox If TypeName(ctrl) = "TextBox" Then ' if control name is 1 (first created TextBox in your array) If ctrl.Name = "1" Then absorb_text = ctrl.Text ' the message box is for debug only MsgBox absorb_text End If End If Next ctrl End Sub 的右侧应该是正则表达式。

如果你在那里放一个字符串,它将被转换为正则表达式。

所以当你说:

=~

你得到:

  

在regex m //中跟踪\ _

文字if ("\\" =~ "\\") { print "true\n"; } 转换为字符串\\,后者转换为正则表达式\(因为\后跟结尾仍为\ )。

这不是有效的正则表达式,因此您会收到错误消息。我不明白你为什么这么认为在这种情况下它可以工作并按预期打印出来。

在第二种情况下,文字\将转换为字符串DATA\\DATA,并转换为正则表达式DATA\DATA。这与DATA[^0-9]ATA不匹配,因为您有两个字符,它只需要一个非数字。

如果您打算使用DATA\DATA,请在RHS上添加一个真正的正则表达式。它简单得多。

答案 2 :(得分:-2)

$input = "DATA\\DATA";
if ($input =~ /\\/) { print "true\n"; } else { print "false\n"; }

您可能需要查看regular expressions