Regex 如何仅匹配字符串中单词的一个实例?
如何仅匹配字符串中单词的一个实例?Regex 如何仅匹配字符串中单词的一个实例?,regex,perl,match,Regex,Perl,Match,如何仅匹配字符串中单词的一个实例? 例如,使用“fred”作为测试词,字符串“fredwillmawilliamjohn”的match应为TRUE,而“fredwillmawilliamfred”的match应为FALSE?您可以通过在列表上下文中使用/g标志并将其转换为标量上下文来计算匹配数 use strict; use warnings; use feature 'say'; for my $string (qw(fredwilmawilliamjohn fredwilmawilliam
例如,使用“fred”作为测试词,字符串“fredwillmawilliamjohn”的match应为TRUE,而“fredwillmawilliamfred”的match应为FALSE?您可以通过在列表上下文中使用
/g
标志并将其转换为标量上下文来计算匹配数
use strict;
use warnings;
use feature 'say';
for my $string (qw(fredwilmawilliamjohn fredwilmawilliamfred) ) {
my $count = () = $string =~ m/(fred)/g;
if ( $count == 1 ) {
say $string;
}
}
最相关的部分是
=()=
,它强制匹配到列表上下文中。然后,my$count
将强制该匹配列表进入标量上下文,这将为您提供列表中的项数。这是您的匹配数。您可以通过在列表上下文中使用/g
标志并将其转换为标量上下文来计算匹配数
use strict;
use warnings;
use feature 'say';
for my $string (qw(fredwilmawilliamjohn fredwilmawilliamfred) ) {
my $count = () = $string =~ m/(fred)/g;
if ( $count == 1 ) {
say $string;
}
}
最相关的部分是
=()=
,它强制匹配到列表上下文中。然后,my$count
将强制该匹配列表进入标量上下文,这将为您提供列表中的项数。这是您的匹配数。听起来您希望匹配模式,并验证该模式随后不会出现在字符串中。这个怎么样,使用负前瞻
m/fred(?!.*fred)/
细分:
?!--不接
.*--零个或多个字符听起来像是要匹配模式,并验证该模式随后不会出现在字符串中。这个怎么样,使用负前瞻
m/fred(?!.*fred)/
/fred(*COMMIT)(?!.*?fred)/s
细分:
?!--不接
.*--零个或多个字符
/fred(*COMMIT)(?!.*?fred)/s
(*COMMIT)
(在perl 5.10中添加)表示在匹配fred
后,如果剩余的正则表达式失败,不要回溯并再次尝试匹配它。如果*?fred
(fred后面的任意字符数)在第一个fred之后匹配,则正则表达式的其余部分表示不匹配,即没有更多的fred
在5.10之前,您需要强制正则表达式中的第一个fred仅与字符串中的第一个fred匹配,如下所示:
/^(?:(?!fred).)*+fred(?!.*?fred)/s
(匹配任意数量的字符,只要它们不是fred的开头,然后再匹配不能后跟另一个fred的fred)
或
(从字符串的开头开始,在不允许回溯的情况下,查找第一个fred,并断言后面没有fred)
(在整个过程中,/s用于使
匹配任何字符,而不仅仅是任何非换行字符。)
(*COMMIT)
(在perl 5.10中添加)表示在匹配fred
后,如果剩余的正则表达式失败,不要回溯并再次尝试匹配它。如果*?fred
(fred后面的任意字符数)在第一个fred之后匹配,则正则表达式的其余部分表示不匹配,即没有更多的fred
在5.10之前,您需要强制正则表达式中的第一个fred仅与字符串中的第一个fred匹配,如下所示:
/^(?:(?!fred).)*+fred(?!.*?fred)/s
(匹配任意数量的字符,只要它们不是fred的开头,然后再匹配不能后跟另一个fred的fred)
或
(从字符串的开头开始,在不允许回溯的情况下,查找第一个fred,并断言后面没有fred)
(自始至终,/s用于使
匹配任何字符,而不仅仅是任何非换行符。)如果你在学习Perl中做练习,你应该自己做。如果你在学习Perl中做练习,你应该自己做。可以使用纯regexp完成吗$_=“弗雷德·威廉姆斯·威尔玛”;如果(/regexp/){print“字符串中只有一个fred”}@SKS,您的意思是要将所有逻辑放入模式中?我想,弗雷德和消极的人什么都不想,什么都不想,弗雷德紧随其后。我现在没有电脑。你得自己试试。=()=
也被称为“goatse操作符”:)它能用纯regexp完成吗$_=“弗雷德·威廉姆斯·威尔玛”;如果(/regexp/){print“字符串中只有一个fred”}@SKS,您的意思是要将所有逻辑放入模式中?我想,弗雷德和消极的人什么都不想,什么都不想,弗雷德紧随其后。我现在没有电脑。您必须自己尝试。=()=
也称为“goatse操作符”:)这不起作用,因为regexp将尝试使负前瞻成功。如果它能在字符串中找到与第二个fred不匹配的内容,则正则表达式将成功<代码>!m/fred(?=.*fred)/在这里可以用。@ChrisCharley原则上是正确的,但你说得不太对。此正则表达式将阻止它与第一个fred匹配,但正则表达式的开头将在字符串中进一步尝试,并与第二个fred匹配(后面没有fred)@ysth感谢您澄清我的错误。我现在清楚地看到了regexp是如何工作的。这不会起作用,因为regexp会试图使负前瞻成功。如果它能在字符串中找到与第二个fred不匹配的内容,则正则表达式将成功<代码>!m/fred(?=.*fred)/在这里可以用。@ChrisCharley原则上是正确的,但你说得不太对。此正则表达式将阻止它与第一个fred匹配,但正则表达式的开头将在字符串中进一步尝试,并与第二个fred匹配(后面没有fred)@ysth感谢您澄清我的错误。我现在完全了解了regexp的功能。