当通过Spring输入时,为什么以下正则表达式不起作用?

时间:2013-06-03 18:23:57

标签: java regex

这是弹簧配置:

<bean id="wrapInMarginalMarkup" class="com.a.ChangeContentAction">
        <property name="regEx">
            <bean class="java.util.regex.Pattern" factory-method="compile">
                <constructor-arg value="(.*)(&lt;m&gt;)(.*)(&lt;xm&gt;)(.*)" />
            </bean>
        </property>
        <property name="replaceExpression" value="$1&lt;marginal\.markup&gt;$3&lt;/marginal\.markup&gt;$5" />
    </bean>

该类接受java中的参数,如:

   private Pattern regEx;
    private String replaceExpression;

    /**
     * {@inheritDoc}
     */
    @Override
    public int execute(final BuilderContext context, final Paragraph paragraph)
    {
        String content = paragraph.getContent();
        paragraph.setContent(regEx.matcher(content).replaceAll(replaceExpression));
    }

这就是字符串在模式上匹配的样子:

"Be it enacted by the Senate and House of Representatives of the United States of America in Congress assembled,,&lt;m&gt;Surface Transportation Extension Act of 2012.,&lt;xm&gt;"

这似乎没有真正取代这里的标记,问题是什么?

我希望输出字符串看起来像:

"Be it enacted by the Senate and House of Representatives of the United States of America in Congress assembled,,&lt;marginal.markup&gt;Surface Transportation Extension Act of 2012.,&lt;/marginal.markup&gt;"

2 个答案:

答案 0 :(得分:3)

由于您在Spring XML文件中使用了转义实体,因此传递给compile()方法的实际模式不是

(.*)(&lt;m&gt;)(.*)(&lt;xm&gt;)(.*)

(.*)(<m>)(.*)(<xm>)(.*)

如果你想传递第一个模式,你将不得不逃避&符号:

(.*)(&amp;lt;m&amp;gt;)(.*)(&amp;lt;xm&amp;gt;)(.*)

答案 1 :(得分:1)

尝试通过属性文件解析Reg Ex,然后创建模式对象。我在通过XML bean注入Reg Ex时遇到了同样的问题。

Ex: - 我需要通过在Spring注入来解析Reg Ex (.*)(D[0-9]{7}\.D[0-9]{9}\.D[A-Z]{3}[0-9]{4})(.*)。但它没有用。然后我尝试在Java类中使用相同的Reg Ex硬编码并且它起作用。

Pattern pattern = Pattern.compile("(.*)(D[0-9]{7}\\.D[0-9]{9}\\.D[A-Z]{2}[0-9]{4})(.*)");
Matcher matcher = pattern.matcher(file.getName().trim());

接下来,我尝试在注入时通过属性文件加载Reg Ex。它运作良好。

p:remoteDirectory="${rawDailyReport.remote.download.dir}"
p:localDirectory="${rawDailyReport.local.valid.dir}"
p:redEx="${rawDailyReport.download.regex}"

在属性文件中,属性定义如下。

(.*)(D[0-9]{7}\\.D[0-9]{9}\\.D[A-Z]{2}[0-9]{4})(.*)

这是因为占位符的值是通过org.springframework.beans.factory.config.PropertyPlaceholderConfigurer加载的,它会在内部处理这些XML敏感字符。