【问题标题】:What is wrong with this substitution?这个替换有什么问题?
【发布时间】:2010-06-02 12:27:13
【问题描述】:
#!/usr/bin/perl

use strict;
use warnings;

my $s = "sad day
 Good day
 May be Bad Day 
 ";

$s =~ s/\w+ \w+/_/gm;

print $s;

我正在尝试用 _ 替换单词之间的所有空格,但它不起作用。这有什么问题?

【问题讨论】:

    标签: regex perl substitution


    【解决方案1】:

    替换替换整个单词 (\w+),然后是空格,然后是下划线替换另一个单词。

    确实没有必要替换(或捕获重要的)这些词

    $a=~s/\b +\b/_/gm;
    

    将用下划线替换一个分词符(\b,一个词和一个非词之间的零宽度转换),后跟一个或多个空格,然后是另一个分词符。使用\b 可确保您不会替换新行前后的空格。

    【讨论】:

    • 除非涉及到sorting,否则请不要在示例中使用$a$b
    • $a 用于问题(以及您的答案!)。对于这里的观众,$a$b 在 Perl 中是“预先声明的”,因此您可以在 strict 下的排序例程中使用它。不过,我一直不确定为什么在其他地方使用它们会变得很糟糕。
    • 我知道你从哪里得到$a,看起来 Chas 已经处理好了。我可以发誓我用过$s! ;)
    【解决方案2】:

    这种模式替换可能是最有效的解决方案:

    $a =~ s/\b \b/_/g;
    

    【讨论】:

    • 除非涉及到sorting,否则请不要在示例中使用$a$b
    • @Zaid - 好点,但我只是使用与 OP 相同的变量。
    【解决方案3】:

    如果没有涉及明确的look-ahead and look-behind assertions 的答案,这个问题将是不完整的:

    $s =~ s/(?<=\w) (?=\w+)/_/g
    
    • 这实际上与涉及零宽度字边界锚点的解决方案相同,\b

    • 1234563

    【讨论】:

    • +1。我从来没有真正使用过超前和后视断言。谢谢。
    • 好吧,您也不需要在前瞻中使用+。为了弥补它,您错过了空格字符后的+ ;)
    猜你喜欢
    • 1970-01-01
    • 2018-11-26
    • 2018-01-04
    • 2011-03-17
    • 2015-04-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多