Regex 用于突出显示单词的正则表达式
我需要找到字符串中单词的所有位置 此版本几乎可以正常工作,但找不到第一次和最后一次出现:Regex 用于突出显示单词的正则表达式,regex,perl,Regex,Perl,我需要找到字符串中单词的所有位置 此版本几乎可以正常工作,但找不到第一次和最后一次出现: while ('abc abc abc abc' =~ /(?<=\W)abc(?=\W)/g) { print $-[0] . ' - ' . $+[0] . "\n"; } while('abc'=~/(?查询的第一部分实际上是遍历匹配项 say "$+[0] - $-[0]" while $string =~ /abc/g; 然后剩下的问题是指定模式以匹配(实际)需要的内容。但我不认
while ('abc abc abc abc' =~ /(?<=\W)abc(?=\W)/g)
{
print $-[0] . ' - ' . $+[0] . "\n";
}
while('abc'=~/(?查询的第一部分实际上是遍历匹配项
say "$+[0] - $-[0]" while $string =~ /abc/g;
然后剩下的问题是指定模式以匹配(实际)需要的内容。但我不认为全面查找是一个通用的或最好的解决方案
如果需要按照提示匹配“单词”,则单词边界锚(\b
)是合适的
perl -wE'$_=q(ah aha ah no ah); say "$-[0] - $+[0]" while /\bah\b/g;'
当然,要使用的确切模式取决于确切的需求,但现在的工作是编写一个合适的模式,这很好。
一旦你准确地识别出你所使用的有效词,那么
字符类可以是一个实用的解决方案,如果您的单词多于正则表达式的“单词”。†
上面的一行打印
0 - 2
7 - 9
13 - 15
(本文仅讨论正则表达式,但它适用于问题的定位。)
此代码是在没有具体说明的情况下编写的,可能需要针对任何特定用途进行调整。您可以这样做:
while ('abc abc abc abc' =~ /(?:^|(?<=\W))abc(?=$|\W)/g) {
say "$-[0] - $+[0]";
}
使用\b
更简单
while ('abc abc abc abc' =~ /\babc\b/g) {
say "$-[0] - $+[0]";
}
最后一个解决方案假设abc
是以\w
字符开头,以\w
字符结尾的占位符。我想你的意思是与周围的(?使用\b
来声明单词边界,即\babc\b
第一条注释解决了问题。谢谢。请注意,连字符的单词和带撇号的单词将无法满足您的要求。我看到此操作已关闭(?),但仍建议遵循此操作(根据您的意愿投票,并在合适的情况下接受您的选择)
while ('abc abc abc abc' =~ /(?:^|(?<=\W))abc(?=$|\W)/g) {
say "$-[0] - $+[0]";
}
while ('abc abc abc abc' =~ /(?<!\w)abc(?!\w)/g) {
say "$-[0] - $+[0]";
}
while ('abc abc abc abc' =~ /\babc\b/g) {
say "$-[0] - $+[0]";
}