在字符串中插入反斜杠时遇到问题
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+(?=])
模式匹配:
(?<!\\)
否定后视,断言还不是\
直接向左
\[
匹配[
\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字符串中的斜杠被自动替换掉了