例如,返回axxxghdfx445
中最后一个x
后面的字符串部分(应返回445
)。如何匹配perl正则表达式中最后一次出现字符后的所有内容?
回答
my($substr) = $string =~ /.*x(.*)/;
从的perldoc perlre:
默认情况下,量化的子模式是“贪婪”,也就是说,它将匹配 多次地(给定一个特定的起始位置),而 仍允许其余的模式匹配。
这就是为什么.*x
将匹配高达x
的最后一次出现。
最简单的方法是使用/([^x]*)$/
第一个答案是好的,但 谈“的东西,不包含”当... 我喜欢用“匹配”正则表达式它
my($substr) = $string =~ /.*x([^x]*)$/;
在某些情况下非常有用
正则表达式:/([^x]+)$/
#assuming x is not last element of the string.
最简单的方法不是正则表达式,而是一个简单的split()并获取最后一个元素。
$string="axxxghdfx445";
@s = split /x/ , $string;
print $s[-1];
真的值得创建一个临时数组吗? 'print(split/x /,$ string)[ - 1];'也可以。 – Zaid 2010-08-09 11:04:58
取决于对吗?如果我想使用其他元素呢? – ghostdog74 2010-08-09 11:51:21
另一种方式来做到这一点。它不像单个正则表达式那么简单,但是如果您为速度进行优化,则此方法可能比使用正则表达式的任何方法都快,其中包括split
。
my $s = 'axxxghdfx445';
my $p = rindex $s, 'x';
my $match = $p < 0 ? undef : substr($s, $p + 1);
我很惊讶没有人提到的特殊变量,这样做,$'
:“$'
”返回匹配的字符串之后的一切。 (perldoc perlre)
my $str = 'axxxghdfx445';
$str =~ /x/;
# $' contains '445';
print $';
但是,是有成本的(重点煤矿):
警告:一旦Perl中看到你需要的$ &一个 “$
", or "$'" anywhere in the program, it has to provide them for every pattern match. This may substantially slow your program. Perl uses the same mechanism to produce $1, $2, etc, so you also pay a price for each pattern that contains capturing parentheses. (To avoid this cost while retaining the grouping behaviour, use the extended regular expression "(?: ...)" instead.) But if you never use $&, "$
” 或 “$”“,那么没有 捕捉括号的模式将不会受到处罚。 因此,如果可以的话,尽量避免使用$ &,“$'”和 “$`”,但如果你不能(和一些算法真的 欣赏它们),一旦你使用过一次,因为 你已经支付了价格。截至5.005,$ &不像其他两个 昂贵。
但是等等,还有更多!你会得到两个运营商的价格,立即行动!
作为这个问题一个解决方法,Perl的5.10.0介绍 “$ {^预匹配}”, “$ {^ MATCH}” 和 “$ {^ POSTMATCH}”,这是等效 到“$ `“,$ &和”$'“,只不过它们只能保证是在与”/ p“ (保留)修饰符执行的成功匹配之后定义的 。使用这些变量不会导致全局性能损失,不像它们的标点符号char等价物,但是 在折衷时必须告诉perl何时使用它们。
my $str = 'axxxghdfx445';
$str =~ /x/p;
# ${^POSTMATCH} contains '445';
print ${^POSTMATCH};
我会虚心提交这条路线是在大多数情况下,最好的,最直接的 方法,因为它不要求你做特别的事情 与你的模式建设,以获取postmatch部分,并且 没有性能损失。
除非您正在捕捉“x”的第一个出现,而不是最后一个。 – runrig 2010-08-09 18:03:28
@runrig:哈哈,这样会让我的整篇论文脱轨:)事实上,在这种特殊情况下,'/ x([^ x] *)$ /'会更好......我太习惯于描述'$' ',其他人都忽略了。 – Ether 2010-08-09 21:41:16
如果您在'''字符之前放置'\',则可以避免引号中间的代码样式。 – CyberSkull 2016-02-01 03:02:11
- 1. 正则表达式得到最后一次出现前后的所有内容
- 2. 正则表达式匹配模式的所有最后一次出现
- 3. 正则表达式匹配从最后一次出现的任何关键字的所有内容
- 4. 正则表达式只匹配最后一次出现
- 5. PHP的正则表达式匹配模式匹配的最后一次出现
- 6. Python正则表达式匹配所有,但最后一次出现
- 7. 正则表达式匹配最后一次出现与特定字符串
- 8. 正则表达式匹配两个字符串之间所有字符的最后一次出现
- 9. Perl正则表达式替换点后的最后一个匹配字符串
- 10. 正则表达式匹配问号后的所有内容?
- 11. perl正则表达式匹配一个字符后面的所有单词
- 12. 正则表达式匹配所有内容,但最后四位数字
- 13. 正则表达式匹配最后一段标记和内容
- 14. 正则表达式匹配所有在第一次出现后出现的字符*
- 15. 正则表达式匹配不止一次出现的字符
- 16. 多行正则表达式:匹配最后一次出现只有
- 17. 正则表达式 - 匹配的字符串中第一次出现的所有行,直到下一次出现
- 18. 最后一个字符串与正则表达式不匹配
- 19. 如何有效地匹配Perl正则表达式中已匹配的内容?
- 20. 正则表达式匹配所有内容截至及包括最后括号
- 21. 正则表达式匹配多次出现的字符串
- 22. 正则表达式最后一次出现仍然有关键字后
- 23. 正则表达式:找到最后一次出现的模式
- 24. 正则表达式,删除最后一个正斜杠后的所有内容
- 25. 在最后一次正则表达式匹配之前修剪所有文本
- 26. R正则表达式:找到最后一次匹配
- 27. Python-正则表达式输出最后一次出现[HTML Scraping]
- 28. 正则表达式的最后一次出现:和.tst
- 29. 正则表达式查找字符串的最后一次出现在URL
- 30. 正则表达式来打通第二个字符串中最后一次出现匹配
+1确实非常有用 – 2010-08-09 10:53:28
您不需要正则表达式中的前导'。* x'。 – runrig 2010-08-09 18:00:32
这是正确的,谢谢,但这是为了说明“doeas不包含x的东西” – benzebuth 2010-08-10 07:48:24