2009-06-02 61 views
0

如何設置在PCRE正則表達式中匹配事件的順序?PCRE中的匹配順序

我有一個用戶可以提供的動態正則表達式,用於從字符串中提取兩個值並將它們存儲在兩個字符串中。但是,有些情況下這兩個值可能以相反的順序存在於字符串中,所以第一個(\ w +)或其他任何需要存儲在第二個字符串中的情況都是如此。

+1

你能舉幾個例子嗎? – DrAl 2009-06-02 07:01:26

回答

3

您可以使用

(?<name>\w+) 

提取由名字符串與

pcre_get_named_substring 
+0

但是,您如何知道將哪個名稱分配給哪個子字符串?這不會讓你更接近解決找出哪個組匹配哪個子串的真正問題。 – 2009-06-02 13:52:16

1

得到的值如果你匹配具有相同的子模式兩個部分(如\w+),你運氣不好。但是,如果子模式明顯不同,則有幾個選項,但它們都不是很漂亮。下面是一個使用條件結構以任意順序相匹配的HTML腳本元素的srctype屬性的正則表達式:

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

(免責聲明:此正則表達式使得許多不切實際的假設,其中最主要的是,這兩個屬性將出席並且,他們將彼此相鄰。我只使用它來說明該技術。)

如果src屬性出現第一,srctype值將在第一和第二組分別被捕獲。否則,他們會分別出現在第四和第三組中。命名組可以讓事情更容易跟蹤,尤其是如果可以在.NET正則表達式中使用相同的名稱。不幸的是,PCRE要求每個命名組都有一個唯一的名字,這太糟糕了;這是一個非常好的功能。