在字符串中插入反斜杠时遇到问题

Posted

技术标签:

【中文标题】在字符串中插入反斜杠时遇到问题【英文标题】:Having trouble inserting backslashes into a string 【发布时间】:2022-01-19 15:24:46 【问题描述】:

例如,我有这样一行:

abc prt[67][2]

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

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

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

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

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

谁能帮我解决这个问题?

【问题讨论】:

你也在 /r/perl 中问过这个问题,这很好,但让人们知道其他地方可能已经有答案是一种礼貌:reddit.com/r/perl/comments/rhrf3s/… 【参考方案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([\[\]])\\$1g;

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

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

$line = quotemeta($line);

【讨论】:

以上是关于在字符串中插入反斜杠时遇到问题的主要内容,如果未能解决你的问题,请参考以下文章

Masonry jquery 为啥js字符串中的斜杠被自动替换掉了

zeroclipboard复制反斜杠时不正确的解决办法

java 使用正则表达式replace(redEx,replaceStr) 中遇到的问题

Perl中的反斜杠单引号

关于js怎样替换反斜杠和单引号的问题

正则表达式 反斜杠的匹配 2018-11-30