【问题标题】:RegEx match parent items containing duplicatesRegEx 匹配包含重复项的父项
【发布时间】:2015-01-22 16:07:09
【问题描述】:

标题可能令人困惑,但我不知道如何正确表达。

所以这是我的目标。我有这个字符串(或类似的东西):

[some_element]Random string chars [some_element]Ramdon[/some_element] some more random chars[/some_element]

(你们中的一些人可能会认识到这些是 WordPress 短代码,但这种方法在其他地方对我来说仍然有用。)

我需要做的是匹配父“元素”。我通常的做法可能是这样的:

\[(\w+)].*?\[\/\1]

问题是,这在上面的例子中不起作用,因为它的“子元素”有一个相同的结束“标签”。

我怎样才能让这个正则表达式工作,不管有多少嵌套的孩子存在(字面意思是无限数量的重复嵌套孩子)?

【问题讨论】:

  • 这是一个很好的例子,说明正则表达式不是适合这项工作的工具。
  • 您使用什么语言/工具进行正则表达式?
  • @Biffen ...好的,那么什么是正确的工具?
  • @anubhava PHP 是语言
  • @Biffen 然后做一些富有成效的事情并告诉 OP 什么是正确的工具。

标签: php regex duplicates


【解决方案1】:

你可以使用这个recursive regex in PHP:

$re = '~\s* ( \[some_element\] ( (?: .* | (?1) )* ) \[/some_element\] )~x';

RegEx Demo

这将在匹配组 #2 中为您提供此字符串:

Random string chars [some_element]Ramdon[/some_element] some more random chars

【讨论】:

  • 哇,这似乎可行。我对正则表达式知之甚少,而且我以前也没有听说过这个,但我认为这正是我想要的。我会更多地了解这一点,但我想你明白了。谢谢!
【解决方案2】:

这看起来像是 recursive patterns (in php) 的工作。
但遗憾的是,我太缺乏经验,无法在这里编写模式而不尝试 :(
也许你可以自己弄清楚。我也想试试,不过要花点时间……

你会看那个吗:

({[]} 之间的词不是模式的一部分,它们描述了子模式应该做什么。)

[ ( ( {[]} ) | (?R) )* ]

【讨论】:

  • 您的答案绝对是我正在寻找的,只是不像@anubhava 那样对我的问题的确切答案。不过还是谢谢你!一定要点赞。
猜你喜欢
  • 2016-10-08
  • 1970-01-01
  • 2015-06-22
  • 2021-07-11
  • 1970-01-01
  • 2011-08-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多