Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/20.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_Match - Fatal编程技术网

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的功能。