【问题标题】:Having trouble inserting backslashes into a string在字符串中插入反斜杠时遇到问题
【发布时间】:2023-04-03 04:09:01
【问题描述】:

例如,我有这样一行:

abc prt[67][2]

我需要以这种方式在这一行中插入反斜杠:

abc prt\[67\]\[2\]

所以基本上,每当[somenumber] 出现在文件的行中时,我都需要将其转换为\[somenumber\]

已经尝试过了,但我确定它是错误的,因为它不起作用。

$line =~ s{[(\d+)}{\\[$1]}g;

谁能帮我解决这个问题?

【问题讨论】:

标签: regex perl


【解决方案1】:

您需要转义第一个括号并在替换的模式侧包含第二个括号:

use warnings;
use strict;

while (my $line = <DATA>) {
    $line =~ s{\[(\d+)]}{\\[$1\\]}g;
    print $line;
}

__DATA__
abc prt[67][2]
foo[0]

打印:

abc prt\[67\]\[2\]
foo\[0\]

【讨论】:

    【解决方案2】:

    你可以匹配

    (?<!\\)\[\d+(?=])
    

    模式匹配:

    • (?&lt;!\\) 否定后视,断言还不是\ 直接向左
    • \[匹配[
    • \d+ 匹配 1+ 位
    • (?=]) 正向前瞻,直接向右断言]

    并用反斜杠之间的完全匹配替换。

    Regex demo

    use strict;
    use warnings;
    
    my $line = 'abc prt[67][2]';
    $line =~ s/(?<!\\)\[\d+(?=])/\\$&\\/g;
    print $line
    

    输出

    abc prt\[67\]\[2\]
    

    【讨论】:

      【解决方案3】:

      你可以这样做:

      echo 'abc prt[67][2] [no number]' | perl -lpE 's/(\[)(\d+)(\])/\\\1\2\\\3/g'
      abc prt\[67\]\[2\] [no number]
      

      只是不要迷失在所有的反斜杠中。

      【讨论】:

        【解决方案4】:

        需要补充几点:

        $line =~ s{\[(\d+)\]}{\\[$1\\]}g;
        #          ^      ^^       ^^
        

        值得注意的是,[] 需要在模式中进行转义,否则它们具有特殊含义。


        您要求转义包含“数字”的[]

        您是否考虑过转义所有[]

        $line =~ s{([\[\]])}{\\$1}g;
        

        您是否考虑过转义所有非单词字符?

        $line =~ s{(\W)}{\\$1}g;
        

        $line = quotemeta($line);
        

        【讨论】:

          猜你喜欢
          • 2016-01-20
          • 2013-09-03
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-05-29
          • 1970-01-01
          相关资源
          最近更新 更多