【问题标题】:Why do strings not match?为什么字符串不匹配?
【发布时间】:2011-04-14 18:33:02
【问题描述】:

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

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

我在调试模式下的尝试:

  1. eq 评估的两个字符串相等
  2. == 评估的两个字符串相等
  3. 手动将另一个变量设置为相同的字符串,然后使用新变量执行if语句; if($pin_list =~ /$x/){do something}。这次尝试成功了。
  4. 多次对两个字符串变量执行chomp(var),然后运行代码。失败
  5. 在两个变量上通过$tst_pins =~ s/\n//g 删除了回车。失败
  6. 两个变量的长度相同。
  7. 手动打印的两个 vars 和视觉验证的两个字符串是相同的。

有人有什么想法吗?我怀疑这与写字板有关,也可能与隐藏字符有关,但不知道如何追踪它。


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


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

我有一个用“+”“加入”的字符串。所以字符串如下所示:

“1+2+3+4+a+b+等”

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

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

布雷特

【问题讨论】:

  • 如果是eq,你为什么不用那个???
  • 您能否为您的解决方案创建一个答案,而不是将其添加到您的问题中?这样,其他人可以更容易地看到解决方案。如果您愿意,您甚至可以接受自己的答案并收集一些代表点! :)

标签: regex perl strawberry-perl wordpad


【解决方案1】:

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

这会检查$str1 是否等于$str2

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

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

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

当然,你可以使用eq

$str1 eq $str2

【讨论】:

    【解决方案2】:

    + 和其他字符在正则表达式中具有特殊的含义,所以只使用$expression =~ /$some_arbitrary_string/ 会给你带来麻烦。

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

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

    【讨论】:

    • 假设这是 Perl,你也可以使用 \Q 和 \E 在匹配表达式中自动引用变量的内容。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-08-09
    • 1970-01-01
    • 1970-01-01
    • 2019-12-03
    • 1970-01-01
    • 1970-01-01
    • 2021-10-15
    相关资源
    最近更新 更多