2012-05-23 35 views
2

我想要將大量(> 1500)的JSP文件轉換爲JSPX。我使用的工具將解析格式良好的JSP並轉換爲JSPX,但是,我的JSP並非都是格式良好的:)使用正則表達式處理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 ...我正在做一個簡單的語法轉換來準備解析輸入。

+1

看起來您正在嘗試將類似XML的語言與正則表達式匹配。在繼續沿着這條道路前,您可能需要閱讀http://stackoverflow.com/a/1732454/159388。 – murgatroid99

+0

不,我沒有試圖用正則表達式來解析XML。正如我在上面提到的問題,我正在使用另一個解析JSP的工具。在解析器完成其工作之前,我正在嘗試對文本進行詞法預處理。 –

回答

0

如果一個句子中包含的匹配令牌如雙引號的任意數量,則這句話屬於上下文無關語言,這根本無法與正則表達式設計被解析處理常規語言。

要麼可能有一些簡化假設(例如沒有不匹配的雙引號,只有一定數量的這些等),這將允許使用正則表達式,或者您需要考慮使用(創建)一個用於上下文無關語言的詞法分析器。 ANTLR是一個很好的工具。

0

基於這樣的假設,有在小腳本內部沒有不帶引號的屬性值,下面的結構可能會爲你工作:

注:這種方法是脆弱的。僅供您參考。

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