0

私は現在、大学の課題に取り組んでおり、正規表現/正規表現に関する (おそらく単純な) 質問があります。

要約する; この割り当ては、JSP と RESTful Web サービスを使用する単純な RSS フィード マネージャーです。

私は現在、XML フィード データを入力できるようにする必要がある割り当て仕様のセクションに取り組んでいます (例: <feeds><feed><name>FEED NAME</name><uri>http://FEEDuri/</ uri></feed></feeds> など)、このデータから、正規表現を介して FEED NAME & FEEDuri を抽出します。

私の講師は、私たちが取り組むための基本的な方法を提供してくれました。私はそれを RESTful Web サービス内に正しく実装したと思います。そして今、エラー処理を実装しています。

ユーザーによるデータ入力がない場合のエラー処理の実装に成功しました。私の質問は次のとおりです:サンプル メソッド (以下) に基づいて、フィード形式の入力が正しくない場合のエラー処理を実装することは可能ですか?

例:&lt; fed> FEED NAME < /fiid> < uro>http://FEEDuri< /pro>ここにある XML タグは明らかに正しくありません。

正規表現は、コンパイル メソッドに引数として渡された定義済みの値の間にある場合にのみ、文字列からグループを取得しますか?

私の質問を補足するために、(XML パーサーの代わりに) 使用するために与えられた基本メソッドを次に示します。

public static List<Feed> getFeedsFromXml(String xml) {
      Pattern feedPattern = Pattern.compile("<feed>\\s*<name>\\s*([^<]*)</name>\\s*<uri>\\s*([^<]*)</uri>\\s*</feed>");
      Matcher feedMatch = feedPattern.matcher(xml);

      while (feedMatch.find()) {
          String feedName = feedMatch.group(1);
          String feedURI = feedMatch.group(2);
          feeds.add(new Feed(feedName, feedURI));
      }

      return feeds;
}
4

2 に答える 2

1

あなたの正確な質問が何であるか完全にはわかりません。私が正しく理解していれば、エラー処理を実装しているので、形式が正しくないXMLをきれいに処理する必要があります。ここでは、2つの考慮事項があります。1)不正な形式のXMLについてエラーを報告する必要があり、2)正規表現が正しいXMLと一致することを望まず、不正な形式のXMLを黙ってスキップする必要があります。

Matcher.find()まず、XMLパーサーの簡略化されたバージョンでどのように機能するかを見てみましょう。<feed>との間にあるものすべてに一致させたい</feed>。簡単にするために、結果をディスプレイに出力するだけです。

コード:

import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class RegexDemo {

    public static void main(String[] args) {
        System.out.println("Good XML");
        String goodXML = "<feed>CODE-GURU</feed><feed>ALEXM</feed>";
        matchFeeds(goodXML);

        System.out.println("Bad XML 1");
        String badXML1 = "<fed>CODE-GURU</feed><feed>ALEXM</feed>";
        matchFeeds(badXML1);

        System.out.println("Bad XML 2");
        String badXML2 = "<feed>CODE-GURU</fid><feed>ALEXM</feed>";
        matchFeeds(badXML2);

        System.out.println("Bad XML 3");
        String badXML3 = "<feed>CODE-GURU</fid><fiid>ALEXM</feed>";
        matchFeeds(badXML3);
    }

    public static void matchFeeds(String xml) {
        Pattern feedPattern = Pattern.compile("<feed>([^<]*)</feed>");
        Matcher feedMatch = feedPattern.matcher(xml);

        while (feedMatch.find()) {
            String feedName = feedMatch.group(1);

            System.out.println("Feed Name: " + feedName);
        }
    }
}

出力:

Good XML
Feed Name: CODE-GURU
Feed Name: ALEXM
Bad XML 1
Feed Name: ALEXM
Bad XML 2
Feed Name: ALEXM
Bad XML 3

「GoodXML」テストは、期待される内容を正確に出力します。ただし、Java正規表現がどのように機能するかを理解していない場合は、「BadXML1」と「BadXML2」に驚かれるかもしれません。Matcher.find()は、「パターンに一致する入力シーケンスの次のサブシーケンス」を検索します。これは、有効な一致が見つかるまで、一致しないものはすべてスキップすることを意味します。

幸い、正しい正規表現を使用して、入力の先頭から一致を強制的に開始できます。\G正規表現の先頭にを追加するだけMatcher.find()で、最後の試合の最後から正確に開始されます。したがって、私の例では、正規表現はになります"\\G<feed>([^<]*)</feed>"

于 2012-08-31T00:30:55.303 に答える
1

はい、正規表現は、一致する文字列のセクションのみに一致します。正規表現に が含まれている場合、または"<feed>"のような文字列に一致しません。"<fed>""<fiid>"

入力文字列に正規表現の一致がない場合、feedMatch.find()は最初に呼び出したときに単に false を返すため、whileループ内では何も実行されません。このメソッドは、おそらく当然のことながら、単に空のリストを返します。

于 2012-08-31T00:01:57.027 に答える