2

我有大量 (>1500) JSP 文件正在尝试转换为 JSPX。我正在使用一个工具来解析格式正确的 JSP 并转换为 JSPX,但是,我的 JSP 并不都是格式正确的 :)

我的解决方案是预处理 JSP 并转换不整洁的代码,以便该工具正确解析它们。我要解决的主要问题是未引用的属性值。例子:

<INPUT id="foo" size=1>
<input id=body size="2">

我当前用于查找这些的正则表达式是(Java 字符串格式):

"(\\w+)=([^\"' >]+)"

我的替换字符串是(Java 字符串格式):

"$1=\"$2\""

这很好用,除了一些模式,它们都涉及内联脚本。例如:

<INPUT id=foo value="<%= someBean.method("a=b") %>">

在这种情况下,我的模式匹配字符串文字“a=b”,我不想这样做。我想要发生的是正则表达式会忽略 <% 和 %> 之间的任何内容。是否有一个正则表达式可以做我想做的事情?

编辑:更改为标题以澄清我不是试图用正则表达式解析 HTML / JSP...我正在做一个简单的句法转换来准备解析的输入。

4

2 回答 2

0

基于在 scriptlet 中没有不带引号的属性值的假设,以下构造可能对您有用:

注意:这种方法很脆弱。仅供参考。

import java.util.regex.*;

public class test{
  public static void main(String args[]){
    String s = "<INPUT id=foo abbr='ip ' name =  bar color =\"blue\" value=\" <%= someBean.method(\" a = b \") %>\" nickname =box  >";
    Pattern p = Pattern.compile("(\\w+)\\s*=\\s*(\\w+[^\"'\\s])");
    Matcher m = p.matcher(s);
    while (m.find())
    { 
      System.out.println("Return Value :"+m.group(1)+"="+m.group(2));
    }
 }
}

输出:

Return Value:id=foo
Return Value:name=bar
Return Value:nickname=box
于 2012-05-24T01:40:07.333 回答
0

如果一个句子包含任意数量的匹配标记(例如双引号),则该句子属于上下文无关语言,它根本无法使用旨在处理常规语言的 Regex 进行解析。

可能有一些简化假设(例如,没有不匹配的双引号,并且只有一定数量的双引号等)允许使用正则表达式,或者您需要考虑使用(创建)词法分析器/解析器上下文无关语言的一个例子。ANTLR是一个很好的工具。

于 2012-05-24T05:46:24.610 回答