【问题标题】:Perl regex - can I say 'if character/string matches, delete it and all to right of it'?Perl 正则表达式 - 我可以说'如果字符/字符串匹配,删除它并删除它'?
【发布时间】:2012-10-01 09:56:20
【问题描述】:

我有一个字符串数组,其中一些包含字符“-”。我希望能够搜索它以及包含它的那些字符串,我希望删除它右侧的所有字符。

例如,如果我有:

$string1 = 'home - London';
$string2 = 'office';
$string3 = 'friend-Manchester';

或类似的东西,那么受影响的字符串将变为:

$string1 = 'home';
$string3 = 'friend';

我不知道 '-' 之前的空格是否会在之后包含在字符串中(我不想要它,因为我稍后会比较字符串,尽管如果它不影响字符串比较然后没关系)。

我确实知道我可以使用以下内容搜索和替换特定的字符串/字符:

$string1 =~ s/-//
or 
$string1 =~ tr/-//

但我对 Perl 中的正则表达式不是很熟悉,所以我不能 100% 确定这些。我环顾四周,在正则表达式中看不到与 'to the right of' 有任何关系。感谢您的帮助!

【问题讨论】:

    标签: regex perl replace


    【解决方案1】:

    您可以使用此替换删除连字符 - 之后的任何内容:

    s/-.*$//s
    

    但是,您需要删除连字符之前的空格,然后这样做

    s/\s* - .* $//xs
    

    $ 将正则表达式锚定在字符串的末尾,/s 标志也允许点匹配换行符。虽然$ 是多余的,但它可能会增加清晰度。

    您的替换只会删除第一个 -,而您的音译会删除字符串中的所有连字符。

    【讨论】:

    • 两个答案都很好~这个答案有点多,但每个都+1 :)
    【解决方案2】:

    您的正则表达式只是在搜索破折号,所以这就是它们所替换的全部。你想搜索破折号,以及它后面的任何东西。

    $string =~ s/-.*//;
    

    。代表任意字符,*表示对该字符搜索0次或多次,并尽可能多地匹配(即尽可能匹配到字符串的末尾)

    你也可以在它前面搜索一个可选的空格。

    $string =~ s/\s?-.*//;
    

    (\s 是一种更清晰的指定空格字符的方法)

    【讨论】:

    • 要使您的空间可选,请在其上附加?
    【解决方案3】:

    也可以使用普通的substr()index()

    my @strings = ("we are - so cool",
                   "lonely",
                   "friend-Manchester",
                   "home - london",
                   "home-new york",
                   "home with-childeren-first episode");
    local $/ = " ";
    foreach (@strings) {
      $_ = substr($_,0,index($_,'-')) if (index($_,'-') != -1);
      chomp;
    }
    

    【讨论】:

    • 究竟是什么让这种前瞻性?难道只是你没有$string =~这个阶段?
    • 实际上,我决定将其更改为 substr() 和 index() 因为这还没有显示... [-:
    【解决方案4】:

    其他答案都很好。但是,根据您所说的:

    ...如果不影响字符串比较那就没关系

    您根本不需要单独的步骤。假设您要将$string 与另一个变量$search_string 进行比较。以下表达式将检查是否完全匹配,但它会忽略 $string 在破折号后的任何内容:

    if ($string =~ /^$search_string(\s*-|$)/) { print "Strings matched"; }
    

    【讨论】:

    • 由于 OP 似乎表明这将是字符串到字符串的比较,因此需要引用 $search_string 以确保它不被视为正则表达式:/^\Q$search_string\E(\s*-|$)/
    【解决方案5】:

    #Using Regex:

    my @strings = 
    ("we are - so cool",
    "lonely",
    "friend - Manchester",
    "home - london",
    "home - new york",
    "home with-childeren-first episode"
    );
    
    foreach (@strings) {
    $_ =~ s/-\s*[a-zA-Z ]+\s*//g;
    print "NEW: ".$_."\n";
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-12-04
      • 2021-05-31
      • 1970-01-01
      • 2016-02-11
      • 1970-01-01
      • 1970-01-01
      • 2014-11-07
      • 1970-01-01
      相关资源
      最近更新 更多