vol*_*ron 5 regex perl backreference
清除/重置所有正则表达式匹配变量的最佳方法是什么?
示例如何$1在正则表达式操作之间重置并使用最近的匹配:
$_="this is the man that made the new year rumble";
/ (is) /;
/ (isnt) /;
say $1; # outputs "is"
Run Code Online (Sandbox Code Playgroud)举例说明在使用循环时这可能会有什么问题:
foreach (...){
/($some_value)/;
&doSomething($1) if $1;
}
Run Code Online (Sandbox Code Playgroud)更新:我认为我不需要这样做,但是例子2只是一个例子.这个问题是关于重置匹配变量,而不是实现它们的最佳方法.
无论如何,最初我的编码风格更明确并且使用if-blocks.现在回到这个(例2)之后,阅读许多行代码会更加简洁,我会发现这种语法更容易理解.
Mar*_*eed 18
您应该使用匹配的返回值,而不是组变量的状态.
foreach (...) {
doSomething($1) if /($some_value)/;
}
Run Code Online (Sandbox Code Playgroud)
如果比赛成功,$ 1等仅保证反映最近的比赛.除了比赛成功后,你不应该看着他们.
ike*_*ami 14
正则表达式捕获*由成功匹配重置.要重置正则表达式捕获,可以使用保证匹配的普通匹配操作.
"a" =~ /a/; # Reset captures to undef.
Run Code Online (Sandbox Code Playgroud)
是的,它看起来很奇怪,但你要求做一些奇怪的事情.
如果您修复了代码,则不需要看起来很奇怪的解决方法.修复你的代码甚至揭示了一个错误!
修正:
$_ = "this is the man that made the new year rumble";
if (/ (is) / || / (isnt) /) {
say $1;
} else{
... # You're currently printing something random.
}
Run Code Online (Sandbox Code Playgroud)
和
for (...) {
if (/($some_pattern)/) {
do_something($1);
}
}
Run Code Online (Sandbox Code Playgroud)
* - Backrefs是与之前捕获的文本匹配的正则表达式模式.例如\1,\k<foo>.你实际上在谈论"正则表达式捕获缓冲区".
您应该测试匹配是否成功.例如:
foreach (...){
/($some_value)/ or next;
doSomething($1) if $1;
}
foreach (...){
doSomething($1) if /($some_value)/ and $1;
}
foreach (...){
if (/($some_value)/) {
doSomething($1) if $1;
}
}
Run Code Online (Sandbox Code Playgroud)
根据$some_value您要处理的匹配空字符串和/或0的内容和方式,您可能需要也可能不需要进行测试$1.
| 归档时间: |
|
| 查看次数: |
9158 次 |
| 最近记录: |