我有一些带有一系列关键字的文字。
前:
exports.db = db
const db = require('./mongo').db.__db
我需要能够匹配关键字以及导致下一个关键字的所有文字。
类似于:
Text: Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.
FooKeyword: Foo
AnotherKeyword: Yay!
到目前为止,这就是我所拥有的:
Match 1:
Group[0] = FooKeyword
Group[1] = Foo
它在很大程度上起作用,但问题是它不适用于新行。我需要收集每个关键字之间的所有内容。我该怎么做?
以下是我尝试过的示例:https://regex101.com/r/zkLoYZ/6
答案 0 :(得分:1)
您可以尝试:/(Keyword\d+): ?(.+?)(?=\nKeyword|$)/gs
在此处查看:https://regex101.com/r/zkLoYZ/1。
[编辑] 添加说明:
s
标志非常重要,因为您要处理多线(Keyword1:|Keyword2:|Keyword3:)
优化为(Keyword\d+)
Keyword
'来检测每个部分。在新行开头或结束字符串($
)(?=something)
是positive lookahead (.+?)
中,?
表示懒惰,learn more here [编辑] 。
因此,如果您想要使用不同的关键字,则可以保留相同的正则表达式模式,但将(Keyword\d+)
替换为先前生成的关键字列表,这些关键字由|
分隔,就像您实际上一样。
所以更糟糕的是,生成的/(Text|FooKeyword|AnotherKeyword): ?(.+?)(?=\nText|FooKeyword|AnotherKeyword|$)/
将像这里一样工作:https://regex101.com/r/zkLoYZ/4
现在你应该能够重用与\1
的匹配让我尝试:实际上没有办法重用以前的捕获,因为下一个匹配的关键字与刚刚传递的关键字和正则表达式内存中的不一样。 / p>
所以(Text|FooKeyword|AnotherKeyword): ?(.+?)(?=\n(Text|FooKeyword|AnotherKeyword)|$)
是正则表达式的最佳方式。
[编辑]对于JS
由于
s
标志不可用,正则表达式稍微复杂一些。
/(Project|Feature|Scenario|Given|When|Then|#Task): ?((?:\s|\w)+?)(?=\n(?:Project|Feature|Scenario|Given|When|Then|#Task)|$)/gim
i
标志不是强制性的,但我推荐它。
请参阅此处的示例:https://regex101.com/r/zkLoYZ/9