2011-06-29 77 views
0

我有一個WSDL(部分顯示如下),從中我試圖檢索使用正則表達式的所有字符串元素的名稱。如何僅從正則表達式返回組內的匹配?

<xs:element minOccurs="0" name="appCurrDpId" type="xs:string" /> 
<xs:element minOccurs="0" name="appCustomerCapable" type="xs:string" /> 
<xs:element minOccurs="0" name="appDateReceivedSys" type="xs:date" /> 
<xs:element minOccurs="0" name="appDecision" type="xs:string" /> 
<xs:element minOccurs="0" name="appPriority" type="xs:int"/> 
<xs:element minOccurs="0" name="appCountry" type="xs:string" /> 

所以我有其上僅字符串元素髮生線相匹配的正則表達式:

name="(.*?)"\s?type="xs:string 

但我只在由第一組括號包圍的部分感興趣(一組,對吧?),即在name屬性中。

UPDATE:下面

的答案都暴露在我的理解的一個缺陷:我認爲能夠返回一個正則表達式(如由一組所確定的)的一部分是一個正則表達式的特徵,這顯然不是。它更多的是「副作用」,需要更復雜的處理。 就我而言,我希望能夠在我的文本編輯器(Sublime Text)中做到這一點,因爲突出顯示和選擇所有搜索結果的能力非常強大。 無論如何,謝謝你的答案。

+2

您正在使用哪種語言? – Tim

+1

正如建議:對於處理XML文件,您應該_always_使用XML-Parser。例如,什麼關於''? – KingCrunch

+1

@King:使用正則表達式沒有問題,如果這是對格式已知的文件的一次性解析。 – Tim

回答

1

當你正在使用的語言,這裏一個辦法做到這一點在Perl你不說:

#!/usr/bin/perl 
use strict; 
use warnings; 

while(<DATA>) { 
    print $1,"\n" if /name="(.*?)"\s*type="xs:string/; 
} 

__DATA__ 
<xs:element minOccurs="0" name="appCurrDpId" type="xs:string" /> 
<xs:element minOccurs="0" name="appCustomerCapable" type="xs:string" /> 
<xs:element minOccurs="0" name="appDateReceivedSys" type="xs:date" /> 
<xs:element minOccurs="0" name="appDecision" type="xs:string" /> 
<xs:element minOccurs="0" name="appPriority" type="xs:int"/> 
<xs:element minOccurs="0" name="appCountry" type="xs:string" /> 

輸出:

appCurrDpId 
appCustomerCapable 
appDecision 
appCountry 
+0

謝謝你的答案。不幸的是我只能挑一個。正如我在對我的問題的評論中所解釋的那樣,我認爲獲得比賽的一部分是可以在正則表達式本身中指定的,但顯然不是。 – mydoghasworms

1

如果你把周圍你想要的東西支架,你可以參考它在您更換爲$1$2等爲第1,第2個括號組等,這裏是你會怎麼做它在Java:

String name = line.replaceAll("^.*name=\"(.*?)\"\\s?type=\"xs:string\".*$", "$1"); 
+0

感謝您的回答。在你和M42之間選擇是很困難的。 – mydoghasworms

相關問題