Java 用Regex处理JSP文本

Java 用Regex处理JSP文本,java,regex,Java,Regex,我有大量(>1500)的JSP文件,我正试图将其转换为JSPX。我使用的工具将解析格式良好的JSP并转换为JSPX,但是,我的JSP并不都是格式良好的:) 我的解决方案是预处理JSP并转换不整洁的代码,以便工具正确解析它们。我试图解决的主要问题是不带引号的属性值。示例: <INPUT id="foo" size=1> <input id=body size="2"> 我的替换字符串是(Java字符串格式): 这很有效,除了少数模式,它们都涉及内联scriptlet。例如

我有大量(>1500)的JSP文件,我正试图将其转换为JSPX。我使用的工具将解析格式良好的JSP并转换为JSPX,但是,我的JSP并不都是格式良好的:)

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

<INPUT id="foo" size=1>
<input id=body size="2">
我的替换字符串是(Java字符串格式):

这很有效,除了少数模式,它们都涉及内联scriptlet。例如:

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

在本例中,我的模式匹配字符串文字“a=b”,我不想这样做。我希望发生的是正则表达式会忽略两者之间的任何内容。有一个正则表达式可以完成我想做的事情吗

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

基于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));
    }
 }
}

基于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));
    }
 }
}

如果一个句子包含任意数量的匹配标记(如双引号),那么这个句子属于上下文无关语言,不能用专门处理常规语言的正则表达式解析


可能存在一些简化假设(例如,没有不匹配的双引号,只有一定数量的双引号等),允许使用正则表达式,或者您需要考虑为上下文无关语言的情况使用(创建)一个lexer/parser。是一个很好的工具。

如果一个句子包含任意数量的匹配标记,如双引号,那么这个句子属于上下文无关语言,不能用专门处理常规语言的正则表达式解析


可能存在一些简化假设(例如,没有不匹配的双引号,只有一定数量的双引号等),允许使用正则表达式,或者您需要考虑为上下文无关语言的情况使用(创建)一个lexer/parser。是一个很好的工具。

看起来您正在尝试将类似XML的语言与正则表达式相匹配。在继续此路径之前,您可能需要阅读。不,我不想用正则表达式解析XML。正如我在上面的问题中提到的,我正在使用另一个解析JSP的工具。在解析器开始工作之前,我正在尝试对文本进行词法预处理。看起来您正在尝试将类似XML的语言与正则表达式相匹配。在继续此路径之前,您可能需要阅读。不,我不想用正则表达式解析XML。正如我在上面的问题中提到的,我正在使用另一个解析JSP的工具。我试图在解析器开始工作之前,对文本进行词法预处理。
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