1

次の文字列とパターンがあります。

String  = <html><body><input type="hidden" name="AvailabilityInputScheduleSelectView$market1" value="5~76AB~|VY~8001~"></input></body></html>
Pattern = AvailabilityInputScheduleSelectView$market1" value="(.*)|VY~(.*)~

私は期待しました:

m.group(0) = 5~76AB~ (最初の (.*) に一致する文字)

m.group(1) = 8001 (2 番目 (.*) に一致する文字)

しかし、私は得る:

m.group(0) = VY~8001~

m.group(1) = null

m.グループ (2) = 8001

2 つのパターン (.*) しかない場合、どうすれば 3 つのグループ (0,1,2) を取得できますか?

多くの組み合わせを試しましたが、期待した結果を得ることができません。

パターン内で許可されていない文字を使用することに問題があるかどうかはわかりません。quote メソッドを使用してみましたが、うまくいきません。

誰でも私を助けることができますか?

4

2 に答える 2

4

group(0)group()常に一致した式全体を返し、引数なしで呼び出すのと同じです。
2 つのグループは、それぞれ group1およびgroup になり2ます。

あなたのグループの 1 つである理由null|、正規表現で特別な意味を持つor. の片面のみorが毎回一致するため、どちらの面が一致しなかったかに応じて、group(1)またはgroup(2)が を返します。null期待どおりの結果を得るには、 を に変更し|て文字どおり\\|に一致させます。|

于 2012-09-08T10:41:00.707 に答える
1

$文字列の末尾にand|および comsumed にエスケープを追加しました。

String str = "<html><body><input type=\"hidden\" name=\"AvailabilityInputScheduleSelectView$market1\" value=\"5~76AB~|VY~8001~\"></input></body></html>";
Matcher m = Pattern.compile(".*AvailabilityInputScheduleSelectView\\$market1\" value=\"(.*)\\|VY~(.*)~.*").matcher(str);
if (m.matches()) {
    System.out.println("Everything " + m.group(0));
    System.out.println("1st group: " + m.group(1));
    System.out.println("2nd group: " + m.group(2));
}

出力:

Everything <html>..
1st group: 5~76AB~
2nd group: 8001

ただし、正規表現を使用して HTML を解析することは、実際には悪い考えです。

于 2012-09-08T10:58:07.177 に答える