【问题标题】:Get multiple matches of a group in regular expression在正则表达式中获取组的多个匹配项
【发布时间】:2015-03-10 06:46:13
【问题描述】:

我正在尝试使用正则表达式从 BBCode 获取属性 假设我有这些字符串:

[icons a="1" b='2' c="3"]
[icons d="4" e='5' f="6"]

我需要使用正则表达式来获得这样的匹配:

[
    {'a', '1', 'b', '2', 'c', '3'},
    {'d', '4', 'e', '5', 'f', '6'}
]

我想出了这个正则表达式:

\[icons[\w\s](?:(\w*)\=["|']([^"|']*))+.*?\]

但它只匹配:

[
    {'a', '1'},
    {'d', '4'}
]

如何匹配所有属性?

另外,为了让它更加防弹,有没有办法只匹配它找到的报价?

[icons a="1"] // GOOD
[icons a="1'] // BAD - But still a match

Regex101

【问题讨论】:

  • 您使用的是哪种语言?
  • 对于这种情况,它是无关紧要的,但我使用 PHP。
  • @Vlad 这总是与正则表达式问题相关。就您而言,此信息告诉我们我们可以在答案中使用 PCRE 功能。
  • 另外,这在 .NET 中是微不足道的,因为它的正则表达式风格实际上存储了所有遇到的捕获组。

标签: php regex replace


【解决方案1】:

我认为最好的方法是保持简单:

使用一个正则表达式匹配所有[icons...]

\[icons\b[^\[\]]*\]

以及在每个正则表达式匹配上迭代使用的第二个正则表达式:

(\w+)=(['"])((?:(?!\2).)*)\2

请注意,第一组和第三组将包含您想要的值,第二组包含引号。

【讨论】:

  • 是的,这可以做到,但它使正则表达式中的事情变得简单,但在 PHP 中更复杂。
  • 没有办法绕过它,至少在 PHP 中没有。 .NET 有一个正则表达式引擎,可以记住重复组的单个捕获,但 PCRE 没有。
  • 我明白了...然后我应该替换字符串,并在回调时运行另一个正则表达式以查找属性...但是如果第二个正则表达式没有,我如何从替换中删除“[icons”不退货? (没有提到“图标”这个词)
  • 没那么复杂。使用第一个正则表达式遍历整个输入。对于每个匹配,使用第二个正则表达式迭代该匹配。收集字典中的所有匹配项或任何在 PHP 中调用的数据结构 {...}。收集列表中的所有字典。
  • 最终这就是我所做的,但我想使用一些智能正则表达式让事情变得更简单:-) 但这也适用于我。谢谢。
【解决方案2】:

你必须使用这个可能对你有帮助

\[icons\s(\w)[=]["|'](\d)["|']\s(\w)[=]["|'](\d)["|']\s(\w)[=]["|'](\d)["|']\]

【讨论】:

    猜你喜欢
    • 2016-03-12
    • 2010-11-21
    • 2017-06-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-21
    • 1970-01-01
    • 2016-02-02
    相关资源
    最近更新 更多