Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Regex 用于突出显示单词的正则表达式_Regex_Perl - Fatal编程技术网

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]";
}