2012-02-13 26 views
1

我試圖解析出一個類型的屬性(如:單詞「CUSIP」,「發行人」,和「優惠券」),如下所示:邊界範圍的多個匹配帶單文本

Public Type GetPricesResponse 
    Cusip   As String 
    Issuer   As String 
    Coupon   As String 
End Type 

正則表達式([a-zA-Z0-9]+).+As適用於此代碼片段(請參閱http://regexr.com?300fl),但與大量代碼混合使用時可能無法正常工作。所以,我一直試圖「結合」這個表達式,並在最後的話Public Type放在前面,並End Type來具體確定什麼,我需要如下:

Public\sType\s([a-zA-Z0-9]+).+As.+End\sType 

...但當然再沒有按不匹配任何東西。

我也設置了MultiLine選項。

+0

你最好使用兩個正則表達式,一個相匹配的類型聲明,接着又反覆匹配前面的正則表達式的截取部分中的屬性。 – Cameron 2012-02-13 21:32:14

+0

我喜歡這種簡單。但是這增加了我想要創建的引擎的複雜性。雖然這個例子需要2個正則表達式來查找相關文本,但是另一個示例可能需要4個正則表達式,或者可能更多。 我希望得到一個一體化解決方案來簡化事情。由於「(\ w +)as」完全匹配所有3個屬性,因此爲什麼「Type \。+(\ w +)as \。+ End」與它們匹配呢?這是RegEx引擎邏輯的缺陷,還是我腦中的邏輯不足? (不要回答!)如果你能解釋爲什麼這不起作用的推理,我會很感激! – BigAl 2012-02-17 22:06:42

+0

你的正則表達式中只有一個'(\ w +)';所以它只匹配部分字符串。但即使你重複了內部部分,你也只能成功確定整個字符串是否匹配 - 沒有辦法獲得重複組捕獲的所有值(這是正則表達式的限制)。確切說明你的原始正則表達式的作用:首先找到'公共類型'的第一次出現。然後從該位置匹配儘可能多的字母數字字符(並將它們捕獲到一個組中)。 '。+'到達字符串的末尾,此時... – Cameron 2012-02-17 22:34:59

回答

1

你提出了兩個不同的問題。

第一個問題大致是「我可以寫一個正則表達式來匹配這個東西」,答案是肯定的。爲簡單起見,我用的\w代替[a-zA-Z0-9]

Public\s+Type\s+(\w+)\s+((\w+)\s+As\s+(\w+)\s*('.*\s*)?)+End\s+Type 

接下來就是「我怎麼能解析出的屬性」和這個問題的答案是,寫在註釋:不要使用單一的正則表達式。首先,使用只捕獲定義一個正則表達式:

Public\s+Type\s+\w+\s+(.*?)End\s+Type 

這將使用不情願的量詞*?使正則表達式不會吞噬End TypeDOTALL標誌,這樣就可以匹配多個行。從這場比賽中,你拿組1並多次find如下:

^\s+(\w+)\s+.*$ 

1集團從這場比賽將是你的屬性名稱。

0

使用下面的正則表達式匹配整個事情:

Public\s+Type\s+(?<tname>[\w]+)\s+((?<pname>[\w]+)\s+As\s+(?<ptype>[\w]+)\s+)+End\s+Type 

注意,它使用命名組爲到匹配的內容更容易獲得。因此,在全部內容匹配後,名爲tname的組與匹配類的類型匹配,名爲pname的組匹配屬性名稱,名爲ptype的組匹配相應的屬性類型。

下面是它的現場演示:

http://regexr.com?300l0

+3

很抱歉,這種情況不正確。嵌套組只包含其中一個匹配項。爲了獲得所有這些,你必須首先提取整個類型定義並迭代。 – beerbajay 2012-02-14 08:18:49

+0

@beerbajay嵌套組不重要,應該尋找**名爲**組。名爲'pname'的組將包含屬性名稱。在許多正則表達式引擎中,它們也可以被稱爲'$ {pname}'。 – 2012-02-15 11:18:35

+0

新浪 - 根據您的鏈接和beerbajay的評論,我發現它只捕獲最後3個屬性(「優惠券」),而不是其他兩個(「Cusip」和「Issuer」)。 – BigAl 2012-02-17 21:47:46