【问题标题】:Matching order in PCREPCRE中的匹配顺序
【发布时间】:2009-06-02 06:54:20
【问题描述】:

如何设置 PCRE 正则表达式中的匹配顺序?

我有一个用户可以提供的动态正则表达式,用于从字符串中提取两个值并将它们存储在两个字符串中。但是,在某些情况下,两个值可以在字符串中以相反的顺序排列,因此第一个 (\w+) 或任何需要存储在第二个字符串中的值。

【问题讨论】:

  • 你能举几个例子吗?

标签: c++ c regex pcre


【解决方案1】:

您可以使用按名称提取字符串

(?<name>\w+)

并使用

获取值
pcre_get_named_substring

【讨论】:

  • 但是你怎么知道哪个名字分配给哪个子字符串呢?这使您无法解决找出哪个组匹配哪个子字符串的真正问题。
【解决方案2】:

如果您使用相同的子模式(如\w+)匹配这两个部分,那么您就不走运了。但是如果子模式明显不同,你有几个选择,它们都不是很漂亮。这是一个正则表达式,它使用条件构造来匹配 HTML 脚本元素的 srctype 属性,以任一顺序:

\b(?(?=src=)
  src="([^"]*)"\s+type="([^"]*)"|
  type="([^"]*)"\s+src="([^"]*)"
)

(免责声明:这个正则表达式做了许多不切实际的假设,其中主要是两个属性都将存在并且它们将彼此相邻。我只是用它来说明该技术。)

如果src 属性首先出现,则srctype 值将分别在第一组和第二组中捕获。否则,它们将分别出现在第四组和第三组。命名组将使跟踪事物变得更容易,特别是如果可以像在 .NET 正则表达式中那样在多个地方使用相同的名称。不幸的是,PCRE 要求每个命名组都有一个唯一的名称,这太糟糕了;这是一个非常好的功能。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-12-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-14
    • 2022-01-09
    • 2021-11-26
    相关资源
    最近更新 更多