为什么字符串不匹配?

时间:2011-04-14 18:33:02

标签: regex perl strawberry-perl wordpad

我有一个Wordpad文件,我从中提取两个字符串并进行比较。在这种情况下,它们都是相同的,但我不能使用=~表达式来评估它们。

if($pin_list =~ /$lvl_list/){ do something}

我在调试模式下尝试过:

  1. 两个字符串相等,由eq
  2. 评估
  3. 两个字符串相等,由==
  4. 评估
  5. 手动将另一个变量设置为相同的字符串,然后使用新变量执行if语句; if($pin_list =~ /$x/){do something}。这次尝试很成功。
  6. 多次在两个字符串变量上执行chomp(var),然后运行代码。 FAILED
  7. 在两个vars上通过$tst_pins =~ s/\n//g删除回车。 FAILED
  8. 两个变量的长度相同。
  9. 手动打印两个变量并在视觉上验证两个字符串是否相同。
  10. 有人有任何想法吗?我怀疑它与写字板有关,也许是一个隐藏的字符,但不知道如何跟踪它。


    tchrist - >好问题。在这种情况下,字符串是相等的,但情况并非总是如此。在正常情况下,我只是寻找一个字符串作为另一个字符串的子集。


    对于那些可能感兴趣的人。问题解决了。

    我有一个字符串,我'加'与'+'。所以字符串如下所示:

    “1 + 2 + 3 + 4 + A + B +等”

    '+'最终成了问题。在一位同事的建议下,我执行了一个substr并将其中一个字符串缩小到了违规点。它在捕获'+'之后发生。然后我使用空格而不是'+'加入,一切正常。

    使用字母表以外的其他字符会产生影响,我仍然不知所措,以解释为什么当其他所有字母都相同时。

    布雷特

2 个答案:

答案 0 :(得分:4)

匹配运算符(m//又名//)检查提供的字符串是否与提供的正则表达式模式匹配,而不是字符的字符是否等于提供的正则表达式模式。如果要构建与字符串完全匹配的正则表达式模式,请使用quotemeta

检查$str1是否等于$str2

my $pat = quotemeta($str1);
$str2 =~ /^$pat\z/

quotemeta也可以通过\Q..\E调用。

$str1 =~ /^\Q$str2\E\z/

当然,你可以使用eq

$str1 eq $str2

答案 1 :(得分:3)

+和其他字符在正则表达式中具有特殊含义,因此只使用$expression =~ /$some_arbitrary_string/会让您遇到麻烦。

如果问题是一个字符串是否确实包含在另一个字符串中,您可以使用index而不用担心指定正则表达式的所有规则:

if (index($pin_list, $lvl_list) >= 0) {
    do_something;
}