用Java写的一个正则表达式测试工具,对下载的一个工具做了改进。
写这个的初衷是因为项目中要为struts的html标签加上styleId属性,其属性值一般与property属性值相同。由于页面很多手工修改很可能会出差错工作量也很大,虽然这项工作不是由我来做,但是我建议可以用正则表达式替换来做,可以简单很多。写正则表达式的任何就落在我的头上了,这个正则表达式不会很简单,我需要能够快速的测试正则表达式。而且eclipse或ultraedit等工具一般只接受单行正则表达式,不接受带注释的正则表达式,但是在开发过程中使用带注释的正则表达式是很重要的,将所有的正则表达式写在一行,一旦正则表达式太长很容易把自己搞糊涂,因此我需要将带注释的正则表达式转化成单行的不带注释的正则表达式。
要匹配一个简单的属性,属性包括属性名或属性值,属性值可以包含在单引号或双引号中:
\w+\s*=\s*"[^"]*"|'[^']*'
不幸的是它不能正确匹配:property="<%="prop"+i%>",因此要匹配一个属性:
\w+\s*=\s*(?:"<%=(?:[^%]*|[^>]*)%>"|"[^"]*"|'[^']*')
(?:)表示不捕获该组。
匹配标签的开始部分,(?!\s+styleId),向前负匹配,表示如果已经存在styleId属性就不用替换了
<html:(text|select|hidden)(?!\s+styleId)
匹配property属性之前或之后的部分:
(?:\s+\w+\s*=\s*(?:"<%=(?:[^%]*|[^>]*)%>"|"[^"]*"|'[^']*')(?!\s+styleId))*
匹配property属性:
property\s*=\s*("<%=(?:[^%]*|[^>]*)%>"|"[^"]*"|'[^']*')(?!\s+styleId)
最终结果:
( # 捕捉property属性之前的所有部分,用于替换 <html:(text|select|hidden)(?!\s+styleId) #起始标签,不包含styleId (?:\s+\w+\s*=\s*(?:"<%=(?:[^%]*|[^>]*)%>"|"[^"]*"|'[^']*')(?!\s+styleId))* #property属性之前的属性 \s+ #属性之间的空格 property\s*=\s*("<%=(?:[^%]*|[^>]*)%>"|"[^"]*"|'[^']*')(?!\s+styleId) #property属性 ) ( # 捕捉property属性之后的所有部分,用于替换 (?:\s+\w+\s*=\s*(?:"<%=(?:[^%]*|[^>]*)%>"|"[^"]*"|'[^']*')(?!\s+styleId))* #property属性之后的属性 \s* #开始标签结尾部分可选的空格 (?:/>|>) )
将它转换成不带注释的正则表达式:
*"|'[^']*')(?!\s+styleId))*\s+property\s*=\s*("<%=(?:[^%]*|[^>]*)%>"|"[^"]*"|'[^']*')(?!\s+styleId))((?:\s+\w+\s*=\s*(?:"<%=(?:[^%]*|[^>]*)%>"|"[^"]*"|'[^']*')(?!\s+styleId))*\s*(?:/>|>))
替换表达式为: $1 styleId=$3$4
测试输入:
<html:text property="property">text</html:text> <html:text name="something" property="property" other=""/> <html:hidden name="something" property ="<%="citation[" + index +"].displayFlag"%>" other=""/> <html:hidden property ="<%="citation[" + index +"].displayFlag"%>"/>
使用编辑器的正则表达式替换功能(使用ultraedit需将正则表达式的引擎设置为perl),替换结果将为:
<html:text property="property" styleId="property">text</html:text> <html:text name="something" property="property" styleId="property" other=""/> <html:hidden name="something" property ="<%="citation[" + index +"].displayFlag"%>" styleId="<%="citation[" + index +"].displayFlag"%>" other=""/> <html:hidden property ="<%="citation[" + index +"].displayFlag"%>" styleId="<%="citation[" + index +"].displayFlag"%>"/>