2

JSPXに変換しようとしているJSPファイルが多数(> 1500)あります。整形式の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

スクリプトレット内に引用符で囲まれていない属性値がないという前提に基づいて、次の構成が機能する可能性があります。

注:このアプローチは脆弱です。ご参考までに。

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

文に二重引用符などの任意の数の一致するトークンが含まれている場合、この文は文脈自由言語に属し、通常の言語を処理するように設計された正規表現では解析できません。

正規表現の使用を許可するいくつかの単純化の仮定 (たとえば、一致しない二重引用符はなく、特定の数しかないなど) があるか、または lexer/parser の使用 (作成) について考える必要があるかのいずれかです。文脈自由言語の場合。ANTLRはこれに適したツールです。

于 2012-05-24T05:46:24.610 に答える