我不知道如何正确编写regexp,使其只能匹配heo
。例如,如果我们发现一些l
解析过程中的char-然后取消匹配。
'heo heo helo'.match(/he.*(?!l)o/gi) // should be only [heo, heo]
UPD:我需要在字符串中匹配尽可能多的时间。不是第一个。感谢
示例(错误(:
console.log('heo heo helo'.match(/he.*(?!l)o/gi))
有两个问题:
.*
-尽可能多地匹配换行符以外的任何零个或多个字符,因此将匹配到正则表达式中最后一次出现后续模式。您可以在此处使用非贪婪的.*?
来解决此问题(?!l)o
-总是匹配o
,因为o
不是l
,所以(?!l)
,一个负前瞻,总是返回true,说,是的,继续并返回匹配。你想要一个负面的回顾,这里是(?<!l)
要匹配以he
开头的字符串,然后匹配尽可能少的任何字符(换行字符除外(,然后匹配不以l
开头的o
,可以使用
/he.*?(?<!l)o/gi
请参阅此regex演示。.*?(?<!l)o
模式匹配除换行符字符之外的任何0+个字符,尽可能少,直到不紧跟在l
前面的最左边的o
。
现在,如果您只想匹配以he
开头、以o
结尾且不以l
开头的单词,则可以使用
/bhe[a-z]*(?<!l)ob/gi
/bhe(?![a-z]*lob)[a-z]*ob/gi
请参阅此regex演示和此regex示例。
console.log('heo heo helo'.match(/he.*(?!l)o/gi))
在检查条件(?!l)
之前,匹配任何字符.*
。正则表达式应在匹配字符之前检查条件。
此外,您希望只匹配hexxxo
(x不是l
(,因此您应该在正则表达式中使用b
。我建议使用正则表达式。
console.log('heo heo helo aheob'.match(/bhe[^l]*ob/gi));