首页 > 解决方案 > JS Regex - 匹配直到行尾或一个字符

问题描述

这是我要匹配的示例:

Match everything after this:::
one
two
three
Match this also:::
one
two
three
___
but not this

我的代码:

const thing = /[^:]:::\n([\s\S]*)(_{3}|$)/gm

我希望它匹配':::'之后的所有内容,但是当它看到___时结束,或者如果它不存在,那么文本输入的结尾,$。

它适用于第一个示例,但它继续匹配第二个示例中 ___ 之后的文本。

任何想法如何做到这一点?

我只对第一组的结果感兴趣。我必须对 (_{3}|$) 进行分组,否则它会创建一个无限循环。

标签: javascriptregex

解决方案


您尝试的模式[^:]:::\n([\s\S]*)(_{3}|$)匹配太多,因为[\s\S]*会一直匹配到最后。然后,当在字符串末尾时,有一个交替(_{3}|$)匹配 3 次下划线或字符串末尾。

然后模式可以解决匹配字符串的结尾。


您可以使用捕获组,并匹配以下所有不以开头的行___

[^:](:::(?:\n(?!___).*)*)
  • [^:]匹配任何字符,除了:
  • (捕获组 1
    • :::从字面上匹配
    • (?:\n(?!___).*)*匹配所有不以开头的连续行___
  • )关闭组 1

正则表达式演示

或者如果支持仅获得匹配,则使用否定的lookbehind,断言不:向左

(?<!:):::(?:\n(?!___).*)*

正则表达式演示


推荐阅读