2

コード:

static short state = 0;
static int td_number = 0;

public static void main(String[] args) {

final Pattern p = Pattern.compile("^[\\s]*?\\d+\\.\\d+[\\s]*?");
final short TD_ENTRY = 0;
final short NO_ENTRY = 1;

HTMLEditorKit.ParserCallback callback = new HTMLEditorKit.ParserCallback() {
    public void handleText(char[] data, int pos) {
    switch (state) {
    case NO_ENTRY:
        break;
    case TD_ENTRY: {
        // We are in the right table column
        // Create string from char array
        String s = new String(data);
        Matcher m = p.matcher(s);
        boolean b = m.matches();
        // Check if data information has correct format (0.0)
        if (b) {

        }
    }
        break;
    default:
        break;
    }
    state = NO_ENTRY;
    }

    public void handleStartTag(HTML.Tag tag, MutableAttributeSet set, int pos) {
    if (tag == HTML.Tag.TD) {
      //[...]
    }
    }
};

Reader reader = new StringReader(html);
try {
    new ParserDelegator().parse(reader, callback, false);
} catch (IOException e) {
}
}

正規表現を使用して HTML を解析しようとしています。tdプログラムは、html テーブル内のタグの内容を読み取ります。テーブル セルのコンテンツは、 で定義された特別なパターンに適合する必要がありますPattern p

主な問題は、正規表現パターンがこの "0.1" のようなセル コンテンツに一致しないことです。しかしString s、コードで値 (" 0.1") を使用して手動で定義すると、パターンが一致します。

さらにchar[] data、デバッグ モードでの内容をコピーsし、このコピーした内容で定義すると、上記の手動で定義した値と同じように見えますが、パターンも適合しません。

どの空白文字が実際に読み取られているかを調べることは可能ですか?

空白は常に空白であるとは限らないため、正規表現クラス [\s] と一致しないようです。これは可能ですか?

編集:

回答ありがとうございます。\s 正規表現クラスで認識されなかった空白文字 (\xA0) でした。

(本当にイライラする)反対票を投じた皆さんにとって、私の質問は単に私を誤解していました. おそらく問題は、「正規表現で HTML を解析したい」という文だったのかもしれませんが、実際には、未知の空白文字を含む HTML テーブル セルのコンテンツを持っているだけです ;-)。

jsoup のようなライブラリでも同じ問題が発生したと思います。

4

2 に答える 2

2

Java 正規表現では、非改行スペース文字 (NBSP、U+00A0) は伝統的に、マッチングの目的で空白として扱われません\s。それが問題の原因である場合は、それを既存の空白クラスに追加するだけです。

"^[\\s\\xA0]*\\d+\\.\\d+[\\s\\xA0]*$"

と一致しない他の Unicode 空白文字がありますが\s、どれも NBSP ほど一般的ではありません。

または、Java 7 以降を実行している場合は、UNICODE_CHARACTER_CLASSモードを指定して\s.

于 2013-01-14T17:03:28.973 に答える
0

コードスニペットが長すぎますが、私が理解している限り、浮動小数点数などのようなもの0.0に一致するパターンが必要ですか?10.52パターンを使用します\\d+\\.\\d+

\d+1..n桁 \.はドットを意味します。正規表現の1つのドット.は、「任意の文字」を意味します

使用例は次のとおりです。

String str = "123.456";
Pattern p = Pattern.compile("\\d+\\.\\d+");
Matcher m = p.matcher(str);
if (m.matches()) {
    // do something.
}

ところで、matches()フルラインに一致することに注意してください。行の一部を一致させたい場合は、find()代わりに使用してください。私は個人的に常にfind()開始行と終了行のマーカー^を使用$し、必要に応じて正規表現自体に使用します。

于 2013-01-14T15:35:05.397 に答える