我正在尝试在双引号之间提取单词,它对我来说工作正常,但如果行有额外的属性,那么它会失败。
线:
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="(.+?)".*" />
<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="(.+?)".*" />
<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脚本中是可读的。
谢谢大家的帮助。