RegExp:如何只找到一个匹配(或不匹配模式)



我不知道如何正确编写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));

最新更新