javascript - 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}|$) 进行分组,否则它会创建一个无限循环。
解决方案
您尝试的模式[^:]:::\n([\s\S]*)(_{3}|$)
匹配太多,因为[\s\S]*
会一直匹配到最后。然后,当在字符串末尾时,有一个交替(_{3}|$)
匹配 3 次下划线或字符串末尾。
然后模式可以解决匹配字符串的结尾。
您可以使用捕获组,并匹配以下所有不以开头的行___
[^:](:::(?:\n(?!___).*)*)
[^:]
匹配任何字符,除了:
(
捕获组 1:::
从字面上匹配(?:\n(?!___).*)*
匹配所有不以开头的连续行___
)
关闭组 1
或者如果支持仅获得匹配,则使用否定的lookbehind,断言不:
向左
(?<!:):::(?:\n(?!___).*)*
推荐阅读
- scala - json4s第一次序列化耗时异常长
- react-native-paper - 如何向 React Native Paper Paragraph 添加超链接或邮件链接?
- html - 星级评分组件在悬停时填充所有以前的星星
- android - AdMob:测试广告只展示一次,不再加载
- javascript - 无法读取 null 的属性“addEventListener”,有没有更好的方法来防止这种情况
- graphql - 如何使用带有特定参数的 Nexus 的 Prisma 插件 crud
- list - 如何在不手动复制和粘贴的情况下循环遍历 python 生成的列表?
- python - 在 Python 中查询输入是 int 还是 str
- php - 使用 ajax 向 Textarea 显示值不起作用
- reactjs - 反应生命周期方法 - 过滤的正确方法