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

时间:2018-01-10 13:37:32

标签: regex ant

我试图在双引号之间提取单词并且它对我来说很好但是如果行有额外属性则会失败。

行:

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脚本中使用它。

3 个答案:

答案 0 :(得分:0)

你想要的是一个非贪婪的操作员,所以你可以结合?使它在第一场比赛中停止,在这种情况下,围绕这个词的"提供完美的&#34贪婪停止":

尝试scaext:simpleValue="(.+?)"检索simpleValue see here

之间引号之间的内容

More info here

答案 1 :(得分:0)

以下是我在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>

答案 2 :(得分:0)

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

让我们说,

输入字符串,RTNameTemp = sca:property xmi:id =&#34; _dEriYfYKEeeNrJ1fB1BovA&#34; mustSupply =&#34;假&#34;命名=&#34; SolutionDB&#34;类型=&#34; JDBC:JdbcDataSource&#34; scaext:simpleValue =&#34; DealAmendmentsSolutionJDBC&#34;源=&#34; $ SolutionDB&#34 /

然后在蚂蚁脚本

1)首先我用过 propertyregex property =&#34; RTNamewithQuotes&#34;倍率=&#34;真&#34;输入=&#34; $ {RTNameTemp}&#34;正则表达式=&#34;(。):(。)(scaext simpleValue =)(/)&#34;选择=&#34; \ 3&#34; /&GT;

它将在&#34; scaext之后提取所有行:simpleValue =&#34;即输出将是 &#34; DealAmendmentsSolutionJDBC&#34;源=&#34; $ SolutionDB&#34;

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

propertyregex property =&#34; RTName&#34;倍率=&#34;真&#34;输入=&#34; $ {RTNamewithQuotes}&#34;正则表达式=&#34;([^(&#34;)] +)&#34;选择=&#34; \ 1&#34; /&GT;

结果是:DealAmendmentsSolutionJDBC

实际上你们所提供的解决方案完美无缺,但非常重要的是它应该适合apache ant脚本(在我的例子中)。 我从Wiktor那里得到答案([^&#34;] +),只有我修改过的东西,我取代了实际的&#34; with(ampersandsignquot;)解析为(&#34;)..现在它在apache ant脚本中是可读的。

谢谢大家的帮助。