【问题标题】:Recursive regular expression,how to match the coupled string with regular expression?递归正则表达式,如何将耦合字符串与正则表达式匹配?
【发布时间】:2010-01-13 12:04:41
【问题描述】:

... AA BB sysodufsoufdds BB AA ...

其中AA,BB 可以是任意连续字符串,其中不包含空格。

但我想得到最外的一对AA

更多示例:

输入:

a HH CC abc CC HH c

输出:

HH

输入:

x YYYY j DD GG DD hsu DD GG DD k YYYY o

输出:

YYYY

为了让我的问题更笼统,如何将 html 中的特定标签与正则表达式匹配?我看过各种讨论这个问题的帖子,但没有一个给出正则表达式的答案。相关问题是: I'm looking for a regular expression to remove a given (x)HTML tag from a string

【问题讨论】:

  • 对于输入:“x YYYY DD GG hsu GG DD YYYY”,YYYY 是一个有效的答案吗?
  • 第二个示例不遵循您开始时的模式。第二个例子是AA str1 BB str2 BB str3 AA(即成对的字符串之间有多个空格)。
  • 对于您提供的示例,输出为AA

标签: regex recursion


【解决方案1】:
\b(\w{2,})\b.*\b\1\b

将匹配从第一个连续字符系列到重复的所有内容。反向引用 \1 将包含匹配的模式(例如,您的示例中的 AA、HH 或 YYYY)。

\bs 是强制单词边界所必需的。

编辑:哦。我刚刚注意到您想要完全做其他事情,即从字符串/文件中删除 HTML 标记。 不要为此使用正则表达式。当有人问这样的问题时,我不会引用其他人总是引用的文章,但问题(简而言之)是 HTML 不规则,在这里尝试使用正则表达式只是自找麻烦。这就是为什么没有人(在他们的头脑中)使用正则表达式来“解析”HTML - 他们使用解析器。

也就是说,我已经使用正则表达式从格式良好的 XML 源中提取数据,我完全了解其结构,并且知道我感兴趣的标签永远不会被嵌套等等 - 但是使用正则表达式的递归如果能正常工作的话会非常复杂(C# 和 Perl 对此有一些支持,但它非常麻烦)。

【讨论】:

  • +1 以获得出色的答案,并衷心感谢您没有链接到 The Rant。
【解决方案2】:

我认为您需要在这里提供参考。类似的东西(试图避免任何正则表达式语言的细节):

(\w+) \w* (\w+) \w+ \1 \w* \2

第一次捕获就是你的结果。

我假设用单个空格分隔字符串以使其更清晰,您可能需要使用\s+ 允许任意空格,而\w(标识符字符:大致[a-zA-Z9-0_])是字符串的正确匹配.

【讨论】:

  • 为了让我的问题更笼统,如何将 html 中的特定标签与正则表达式匹配?我看过各种讨论这个问题的帖子,但没有一个给出正则表达式的答案。相关问题是:stackoverflow.com/questions/116403/…
  • Regex 通常是错误的方法,除非上下文受到实质性限制(例如,您控制源)。最好使用解析器(如果您知道它是 XHTML,它可能是 XML 解析器)。
  • 假设我正在处理类似 html 的东西,但不完全是 html。那么 DOM 解析器将无法工作。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-05-01
  • 2013-10-18
  • 1970-01-01
  • 2017-09-26
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多