2

正規表現を使用して html タグをキャッチするように求められます。

A. <TAG ATTRIBUTE="VALUE"/> or
B. <TAG ATTRIBUTE="VALUE"> or
C. <TAG/> or
D. <TAG> or
E. </TAG>

これが私のパターンです:

/** A pattern that matches a simple HTML markup. Group 1 matches
  *  the initial '/', if present.  Group 2 matches the tag.  Group
  *  3 matches the attribute name, if present.  Group 4 matches the
  *  attribute value (without quotes).  Group 5 matches the closing
  *  '/', if present. */
 public static final String HTML_P3 =
     "<(/)?\\s*([a-zA-Z]+)\\s*([a-zA-Z]+)?\\s*=?\\s*\\\"?([^\\\"]+)?\\\"?\\s*(/)?>";    

与えられたテストのスニペットを次に示します。

public static void p3(String name, String markup) throws IOException {
    out.println("Problem #3.");
    Scanner inp = new Scanner(new FileReader(name));
    while (inp.findWithinHorizon(markup, 0) != null) {
        MatchResult mat = inp.match();
        if (mat.group(1) != null
            && (mat.group(5) != null || mat.group(3) != null)) {
            out.printf("Bad markup.%n");
            continue;
        }
        out.printf("Tag: %s", mat.group(2));
        if (mat.group(3) != null) {
            out.printf(", Attribute: %s, Value: \"%s\"",
                        mat.group(3), mat.group(4));
        }
        if (mat.group(5) != null || mat.group(1) != null) {
            out.print(" end");
        }
        out.println();
    }
    out.println();
}

入力は次のとおりです。

This is a simple <i>mark-up</i>.  Next comes
one <input value="3"/> that's closed, 
followed by a list of names:
<ol color="green">
<li> Tom </li>
<li  > Dick </li>
<li> Harry </li>
</ol>

正しい答えは次のとおりです。

Problem #3.
Tag: i
Tag: i end
Tag: input, Attribute: value, Value: "3" end
Tag: ol, Attribute: color, Value: "green"
Tag: li
Tag: li end
Tag: li
Tag: li end
Tag: li
Tag: li end
Tag: ol end

ただし、終了タグをキャッチすることはできません。出力は次のとおりです。

Problem #3.
Tag: i
Tag: input, Attribute: value, Value: "3" end
Tag: ol, Attribute: color, Value: "green"
Tag: li

regexpal.com を使用してみましたが、私のパターンはすべてに一致します。誰か光を当ててくれませんか?

4

1 に答える 1

1

まず、Java の正規表現パターンを作成しようとしているので、Java 正規表現テスターを使用します。

私は Java の専門家ではありませんが、二重引用符をトリプル エスケープする必要があるかどうかはわかりません。

パターンの問題の 1 つは、連続する疑問符を使用することです。([a-zA-Z]+)?\\s*=?\\s*\"?([^\"]+)?\"?すべてを非キャプチャ グループにグループ化するのではなく、次のようにします。

(?:([a-zA-Z]+)\\s*=\\s*\"([^\"]+)\")?

(属性がない場合、equal も引用符も値もありません)

これを試すことができます:(Java文字列として書かれています)

"(?i)<(/)?([a-z1-6]+)(?:\\s+([a-z]+)\\s*=\\s*\"([^\"]*+)\"\\s*)?(/)?>"
于 2013-10-26T02:57:25.793 に答える