如何使用 RegEx (C#) 在特定字符串之后匹配字符串

Posted

技术标签:

【中文标题】如何使用 RegEx (C#) 在特定字符串之后匹配字符串【英文标题】:How to match a string after a specific string using RegEx (C#) 【发布时间】:2018-07-24 12:03:34 【问题描述】:

这是一个序列:

<h>blue</h>
<td>Water</td>
<h>red</h>
<td>Apple</td>
<h>yellow</h>
<td>Sun</td>

我想使用 RegEx 在字符串 red 之后查找第一次出现的 &lt;td&gt;。 我试过(?&lt;=red)(&lt;td&gt;)([\s\S]*?)(&lt;/td&gt;),但我什么也没回。我不确定为什么。 我最接近的是(?&lt;=red)([\s\S]*?)(&lt;/td&gt;),但它添加了空格和标签。

我知道我可以使用索引和子字符串操作来做到这一点,但我宁愿使用 RegEx。

有没有办法做到这一点? 我正在专门寻找 C# 特定的解决方案。

string s = Regex.Match(s, @"(?<=red)([\s\S]*?)(</td>)");

【问题讨论】:

不要为此使用正则表达式。使用 XML 解析器,可能类似于 XPath。 你的正则表达式周围的 c# 代码是什么? @Isaac string s = Regex.Match(s, @"(?)"); cmets 中的代码不存在。相反,edit 您的问题并将其添加到那里。 假设您的“序列”实际上是 XML,并且您正在寻找任何包含“红色”的元素,并且您实际上正在寻找 &lt;td&gt; 元素,而不仅仅是是否存在,您可以使用 @987654329 @。如果这些假设中的任何一个不正确,请澄清您的问题。 【参考方案1】:

如果你确实真的真的想使用 regex 来解决这个问题,请使用:

(?<=red</h>\s*<td>)([^<]*)

它使用(?&lt;=…) 正向后视,并将匹配并捕获\s* 之后的字符串,直到它到达&lt;

但是我真的真的很推荐使用 xml 解析器来做这种操作!!!

【讨论】:

非常感谢艾伦,这完全回答了我的问题!很难得到正则表达式的答案,但当我这样做时,它们是最好的!。 @Phil 你很幸运,这个“完全”回答了你的问题,因为它没有按照你的要求做。您要求“&lt;td&gt; 在字符串 red 之后的第一次出现”,并且此表达式在字符串 red&lt;/h&gt; 之后的空格之后返回 &lt;td&gt;。请注意,此表达式可能不适用于 XML,因为 XML 不需要用空格分隔。以后请准确描述您的问题。 @Dour High Arch。 Allan 很好地描述了这个问题并很好地回答了这个问题,他提供了适当的 RegEx 代码。你没有。我通过 10 000 行文本运行该模式,它是 100% 准确的。

以上是关于如何使用 RegEx (C#) 在特定字符串之后匹配字符串的主要内容,如果未能解决你的问题,请参考以下文章

如何在 C# Regex 中使用lookbehind 来跳过重复前缀模式的匹配?

Regex-在给定数量的3个字母序列之后,如何匹配特定的3个字母序列?

如何在 C# Regex 中使用“或”、“和”?

如何检查 C# 中字符串的特定部分之后的字符?

如何在 C# 中使用 Regex 将 [number] 替换为 number - 1?

如何在 C# 中与 Regex Class 匹配我部分知道的字符串?