C# (.net) RegEx.Match 换行符之间的子字符串 - 使用换行符作为正向超前限制

Posted

技术标签:

【中文标题】C# (.net) RegEx.Match 换行符之间的子字符串 - 使用换行符作为正向超前限制【英文标题】:C# (.net) RegEx.Match Substring between newlines - using newline as positive lookahead limit 【发布时间】:2018-07-14 21:03:03 【问题描述】:

我一直在修改 RegEx 并取得了一些不错的结果,我想继续使用它。

现在我一直在寻找一个设置在 2 个换行符之间的字符串。这是示例目标文本(注意这是数千种可能的文本之一):

Substance information in Wikipedia
FORMULA
CH2O
Grafik
Molar mass: 30,03 g/mol

目标是“CH2O”。

我尝试了(?<=FORMULA).*(?=Grafik)RegexOptions.Singleline,它在FORMULA 之后开始,但一直向下并忽略Grafik

我在没有单行的情况下尝试过,但由于.\n 处停止,它没有返回任何内容。由于我希望换行符作为限制,因此以下没有单行。

我得到的最接近的是这些:

(?<=FORMULA)[\w\W]+(?=Grafik)
(?<=FORMULA)[\w\W]*(?=Grafik)

但是,如果 Grafik 更改,我想跟踪换行符而不是它。

(?&lt;=FORMULA)[\w\W]*(?=\n)(?&lt;=FORMULA)[\w\W]*(?=\r) 仍将匹配 Grafik 出于某种原因...

有没有人知道一种更优化的方法来使正向前瞻成为换行符?

请不要回答任何与 RegEx 无关的内容。

【问题讨论】:

所以为了清楚起见,您想在公式之后和新行之前做很多事情吗? 是的,在其他情况下,CH2O 可能会有所不同,所以我需要一个简并通配符读取。 【参考方案1】:

这对你有用吗

(?<=FORMULA\s+)\S+

匹配FORMULA之后和新行之前的所有内容

【讨论】:

天哪,太明显了! 非常感谢!你是冠军! @PhilZan 没有问题 为了将FORMULA之后的EOL保持在捕获组之外,我认为应该是(?&lt;=FORMULA\s+)\S+

以上是关于C# (.net) RegEx.Match 换行符之间的子字符串 - 使用换行符作为正向超前限制的主要内容,如果未能解决你的问题,请参考以下文章

与 C# 控制台应用程序中的相同代码相比,Regex.Match 在 Unity 中返回不同/错误的结果

.net正则表达式大全(.net 的 System.Text.RegularExpressions.Regex.Match()方法使用)

为啥 Regex.Match 只返回 1 个结果?

正则表达式之Regex.Match()用法

Java Regex match IP address

有没有办法让 Regex.Match 只提供预期的捕获组?