2

JSPからヘッダーファイルの名前を抽出するユーティリティを書いています。JSPを1行ずつ読み、必要な行を見つけるのに問題はありません。正規表現を使用して必要な特定のテキストを抽出する際に問題が発生しました。多くの同様の質問を見た後、私はレンガの壁にぶつかっています。

内部から照合する文字列の例は次のとおりです。

<jsp:include page="<%=Pages.getString(\"MY_HEADER\")%>" flush="true"></jsp:include>

この例では、必要なのはMY_HEADERだけです。私がこのタグを持っているときはいつでも:

<%=Pages.getString

私はこれの間に来るものが必要です:

<%=Pages.getString(\"  and this: )%>

これが私が現在持っているものです(これは機能していません、私は追加するかもしれません):

String currentLine;
while ((currentLine = fileReader.readLine()) != null)
{
Pattern pattern = Pattern.compile("<%=Pages\\.getString\\(\\\\\"([^\\\\]*)"); 
Matcher matcher = pattern.matcher(currentLine); 
while(matcher.find()) {
System.out.println(matcher.group(1).toString());                           
}}

これらのヘッダー名を抽出するには、JavaRegExAPIと正規表現を使用できる必要があります。

この問題に関する助けをいただければ幸いです。ありがとう!

編集:

ありがたいことに、この問題を解決しました。トリッキーな部分は、適切な正規表現が与えられた後、正規表現にフィードする文字列には常に2つの "/"文字((/ "MY_HEADER" /))が必要であることを考慮に入れる必要がありました。パターンでエスケープされます。

これがうまくいったものです(助けに感謝します;-)):

Pattern pattern = Pattern.compile("<%=Pages\\.getString\\(\\\\\"([^\\\\\"]*)"); 
4

1 に答える 1

2

これでうまくいくはずです:

<%=Pages\\.getString\\(\\\\\"([^\\\\]*)

ええ、それは恐ろしい数のバックスラッシュです。matcher.group(1)MY_HEADER を返す必要があります。から始まり\"、次までのすべてに一致します\(ここでは にあると仮定し\")%>ます)。

もちろん、ターゲット テキストにバックスラッシュ ( \) が含まれている場合、これは機能しません。しかし、次のようなものを探しているという兆候はありませんでした<%=Pages.getString(\"Fun!\Yay!\")%>-- この正規表現は返されるだけでFun!、残りは無視されます。

編集

テスト ケースが失敗した理由は、次のテスト文字列を使用していたためです。

String currentLine = "<%=Pages.getString(\"MY_HEADER\")%>"; 

これは、ファイルからそれを読み込んで見るのと同じです:

<%=Pages.getString("MY_HEADER")%> 

がないことに注意してください\。代わりにこれを使用する必要があります。

String sCurrentLine = "<%=Pages.getString(\\\"MY_HEADER\\\")%>"; 

これは、あなたが望むものと同等です。

これは動作するテストコードです:

String currentLine = "<%=Pages.getString(\\\"MY_HEADER\\\")%>"; 
Pattern pattern = Pattern.compile("<%=Pages\\.getString\\(\\\\\"([^\\\\]*)"); 
Matcher matcher = pattern.matcher(currentLine); 
while(matcher.find()) {
    System.out.println(matcher.group(1).toString()); 
}
于 2012-10-04T19:57:39.653 に答える