用于捕获带双引号的单词的正则表达式



我正在尝试在双引号之间提取单词,它对我来说工作正常,但如果行有额外的属性,那么它会失败。

线:

sca:property xmi:id="_P1Nw8fUZEeeA4MWHFtA5gw" mustSupply="false" name="SolutionDB" type="jdbc:JdbcDataSource" scaext:simpleValue="DealAmendmentsSolutionJDBC"

我想提取 scaext:simpleValue 的值,这意味着应该输出"DealAmendmentsSolutionJDBC"。

我用了:(.*)(scaext:simpleValue=)(.*),它工作正常。

但有时线可以是

sca:property xmi:id="_P5X4MvUZEeeA4MWHFtA5gw" mustSupply="false" name="SolutionDB" type="jdbc:JdbcDataSource" scaext:simpleValue="DealAmendmentsSolutionJDBC" source="$SolutionDB"

在这种情况下,我的正则表达式不起作用,输出还包含 source="$solutionDB"...

我希望预期输出为:DealAmendmentsSolutionJDBC

请谁能帮助我获得这个权利来提取 scaext:simpleValue 标签的值。

我在 Apache ant 脚本中使用它。

你想要的是一个非贪婪运算符,这样你就可以?耦合到让它在第一场比赛中停止,在这种情况下,围绕这个词的"提供了完美的"贪婪停止":

尝试scaext:simpleValue="(.+?)"检索引号之间的内容,以便simpleValue在此处查看

更多信息在这里。

以下是我在 Ant 中的做法。通常最好尽可能避免使用ant-contrib(注意:这几乎总是可能的)。

<target name="replace">
<property name="input1" value='sca:property xmi:id="_P1Nw8fUZEeeA4MWHFtA5gw" mustSupply="false" name="SolutionDB" type="jdbc:JdbcDataSource" scaext:simpleValue="DealAmendmentsSolutionJDBC"' />
<property name="input2" value='sca:property xmi:id="_P5X4MvUZEeeA4MWHFtA5gw" mustSupply="false" name="SolutionDB" type="jdbc:JdbcDataSource" scaext:simpleValue="DealAmendmentsSolutionJDBC" source="$SolutionDB"' />
<property name="pattern" value=".*scaext:simpleValue=&quot;(.+?)&quot;.*" />
<property name="replace" value="1" />
<loadresource property="result1">
<propertyresource name="input1" />
<filterchain>
<tokenfilter>
<replaceregex pattern="${pattern}" replace="${replace}" />
</tokenfilter>
</filterchain>
</loadresource>
<loadresource property="result2">
<propertyresource name="input2" />
<filterchain>
<tokenfilter>
<replaceregex pattern="${pattern}" replace="${replace}" />
</tokenfilter>
</filterchain>
</loadresource>
<echo message="${result1}" />
<echo message="${result2}" />
</target>

为方便起见,带有macrodef

<target name="replace">
<property name="input1" value='sca:property xmi:id="_P1Nw8fUZEeeA4MWHFtA5gw" mustSupply="false" name="SolutionDB" type="jdbc:JdbcDataSource" scaext:simpleValue="DealAmendmentsSolutionJDBC"' />
<property name="input2" value='sca:property xmi:id="_P5X4MvUZEeeA4MWHFtA5gw" mustSupply="false" name="SolutionDB" type="jdbc:JdbcDataSource" scaext:simpleValue="DealAmendmentsSolutionJDBC" source="$SolutionDB"' />
<property name="pattern" value=".*scaext:simpleValue=&quot;(.+?)&quot;.*" />
<property name="replace" value="1" />
<replaceregex
property="result1"
input="input1"
pattern="${pattern}"
replace="${replace}"
/>
<replaceregex
property="result2"
input="input2"
pattern="${pattern}"
replace="${replace}"
/>
<echo message="${result1}" />
<echo message="${result2}" />
</target>
<macrodef name="replaceregex">
<attribute name="property" />
<attribute name="input" />
<attribute name="pattern" />
<attribute name="replace" />
<sequential>
<loadresource property="@{property}">
<propertyresource name="@{input}" />
<filterchain>
<tokenfilter>
<replaceregex pattern="@{pattern}" replace="@{replace}" />
</tokenfilter>
</filterchain>
</loadresource>
</sequential>
</macrodef>

我找到了处理我的问题的方法。 在蚂蚁脚本中,我在下面使用

比方说,

输入字符串,RTNameTemp = sca:property xmi:id="_dEriYfYKEeeNrJ1fB1BovA" mustSupply="false" name="SolutionDB" type="jdbc:JdbcDataSource" scaext:simpleValue="DealAmendmentsSolutionJDBC" source="$SolutionDB"/

然后在蚂蚁脚本中

1)首先我用 propertyregex property="RTNamewithQuotes" override="true" input="${RTNameTemp}" regexp="(.)(scaext:simpleValue=)(.)(/)" 选择="\3"/>

它将提取"scaext:simpleValue="之后的所有行,即输出将是 "DealAmendmentsSolutionJDBC" source="$SolutionDB">

在此之后,我将此输出存储在一个属性中,然后使用,

propertyregex property="RTName" override="true" input="${RTNamewithQuotes}" regexp="([^(")]+)" select="\1"/>

所以结果是:交易修正解决方案JDBC

实际上,你们都给出的解决方案可以完美地工作,但非常重要的是,它应该适合 apache ant 脚本(就我而言)。 我从 Wiktor 那里得到了答案来使用 ([^"]+),我唯一修改的是,我用 (& 符号quot;) 替换了实际的"解析为 (") ..所以现在它在Apache Ant脚本中是可读的。

谢谢大家的帮助。

相关内容

  • 没有找到相关文章

最新更新