PCRE中的匹配顺序

时间:2009-06-02 06:54:21

标签: c++ c regex pcre

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

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

2 个答案:

答案 0 :(得分:3)

您可以使用

按名称提取字符串
(?<name>\w+)

并使用

获取值
pcre_get_named_substring

答案 1 :(得分:1)

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

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

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

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