2011-06-29 47 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

相关问题