如何仅从正则表达式返回组内的匹配?

时间:2011-06-29 08:03:59

标签: regex

我有一个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属性中。

更新

下面的答案暴露了我的理解中的一个缺陷:我认为能够返回正则表达式的一部分(由组确定)是正则表达式的一个特征,显然它不是。它更像是一种“副作用”,需要更复杂的处理。 在我的情况下,我希望能够在我的文本编辑器(Sublime Text)中执行此操作,因为它具有突出显示和选择所有搜索结果的极佳能力。 无论如何,谢谢你的答案。

2 个答案:

答案 0 :(得分:1)

如果你在你想要的东西周围放置括号,你可以在你的替换中引用它作为$1$2等第一个,第二个括号内的组等。以下是你将如何做到这一点的java:

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

答案 1 :(得分: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