我有一段经文,而且有数字.我希望每个编号的诗歌都在单独的行中,所以我在它们之前添加一个新行,但我有一些括号也有数字.它们也被新线代替.我不想匹配括号内的数字.我用了
$_=~s/(\d+)/\n$1 /gs;
有了这个输入:
1Hello2Hai (in 2:3) 3hi 4 bye
但它也取代了paranthesis里面的数字.
所需输出:
1 Hello
2 Hai (in 2:3)
3 hi
4 bye
实际产量:
1 Hello
2 Hai (in
2:
3)
3 hi
4 bye
如何构造正则表达式,使其与括号内不匹配.我用perl的是regex.
你可以试试这个:
#!/usr/bin/perl 
use strict;
use warnings;
my $stro = <<'END';
1Hello2Hai (in 2:3) 3hi 4 bye
END
$stro =~s/(\((?>[^()]++|(?1))*\))(*SKIP)(*FAIL)|\s*(\d+)\s*/\n$2 /g;
print $stro;
图案细节:
这个想法是跳过括号中的内容。为此,我尝试首先将括号与此递归子模式匹配:(\((?>[^()]++|(?1))*\))并且使子模式失败并强制正则表达式引擎不要使用带有(*SKIP)回溯(*FAIL)控制动词的其他替代方案重试子字符串。
(*SKIP)如果子模式稍后失败,则强制不重试左侧匹配的内容。
(*FAIL)强制子模式失败。
其他方式:
正如您在Perl 文档中所读到的那样,回溯控制动词是一个实验性的正则表达式功能,应该在生产代码中提及。(但是,这个功能已经存在好几年了。)
这是一种没有这些功能的简单方法:匹配数字前面的所有内容,然后使用以下\K功能将其从匹配结果中删除:
s/(?:(\((?>[^()]++|(?1))*\))|[^\d(]+)*\K\s*(\d+)\s*/\n$2 /g