2010-02-10 51 views
3

我正在嘗試構建一個替代數據條目,其中用戶將表達某種類型的命令,我將對其進行解析。與其詳細討論我將在這項工作中使用的詞彙的細節,以下是我試圖通過對雷克斯哈里森的應用來完成的一個例子。如何從特定順序的字符串中捕獲一組組別

給下面的句子

西班牙的雨水落在西班牙平原

在平原上落下的雨

的降雪在倫敦

草甸

in pseudo正則表達式:

(the (?<weather>\w+)) (in (<?city>\w+)) (falls) (on the (?<topography>\w+)) 

總之我需要用正則表達式來收集天氣,城市和地形。

如何表達可以按任意順序在輸入中出現的一組捕捉?

+0

如果城市是「舊金山」,該怎麼辦? – kennytm 2010-02-10 17:07:24

+0

@肯尼你說得對,聖弗朗西斯科(等等)將是一個問題,這是我的英文單詞比喻失效的地方。 在我的情況下,這些標記值將是我熟悉的用戶代碼,我想我們可以使它成爲令牌都是單個詞的約束條件。 – 2010-02-11 02:43:50

回答

2
^(?:on the (?<area>\w+)() ?|the (?<weather>\w+)() ?|in (?<location>\w+)() ?|falls()){4}\1\2\3\4$ 

將按照任何順序匹配包含每個要素的句子一次。這就是空的括號 - 每個人都必須參加比賽,所以最終\1\2\3\4可以匹配。

指定的反向引用將包含可變元素。

+1

+1:這很巧妙!但請注意:某些引擎(例如Python)會將已命名的捕獲數與已編號的捕獲數進行計數,因此在這種情況下可能需要使用'\ 2 \ 4 \ 6 \ 7'。 – 2010-02-10 20:23:16

+0

這很有趣。 RegexBuddy沒有考慮到這個事實。在.NET中,上面的正則表達式應該可以工作。混合命名和未命名的捕獲組可能通常是一個糟糕的主意;我在這裏做了更好的說明。 – 2010-02-10 20:37:22

+0

玩這個更多。我希望我能夠{1,4} \ 1 \ 2 \ 3 \ 4並捕獲至少1個,最多4個令牌,但這似乎不起作用,它只有4個或沒有。我如何匹配一個部分「句子」? – 2010-02-11 19:21:51

2

首先,這看起來像是一個自然語言解析器的問題。

但如果你真的想要一個正則表達式的解決方案,你必須單獨挑出每個模式,無論是使用正則表達式3或通過管道交替他們,例如:

(the (?<weather>\w+))|(in (<?city>\w+))|(on the (?<topography>\w+)) 

運行上面的任何反對你的例句中,你會得到3場比賽,其中每場比賽將有三組中的一組。

相關問題