这是弹簧配置:
<bean id="wrapInMarginalMarkup" class="com.a.ChangeContentAction">
<property name="regEx">
<bean class="java.util.regex.Pattern" factory-method="compile">
<constructor-arg value="(.*)(<m>)(.*)(<xm>)(.*)" />
</bean>
</property>
<property name="replaceExpression" value="$1<marginal\.markup>$3</marginal\.markup>$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,,<m>Surface Transportation Extension Act of 2012.,<xm>"
这似乎没有真正取代这里的标记,问题是什么?
我希望输出字符串看起来像:
"Be it enacted by the Senate and House of Representatives of the United States of America in Congress assembled,,<marginal.markup>Surface Transportation Extension Act of 2012.,</marginal.markup>"
答案 0 :(得分:3)
由于您在Spring XML文件中使用了转义实体,因此传递给compile()方法的实际模式不是
(.*)(<m>)(.*)(<xm>)(.*)
但
(.*)(<m>)(.*)(<xm>)(.*)
如果你想传递第一个模式,你将不得不逃避&符号:
(.*)(&lt;m&gt;)(.*)(&lt;xm&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敏感字符。