2017-09-26 13 views
0

私の頭の中ではかなり長い間、この問題を解決できません。私はこのコードを持っています:JavaのreplaceAllではなく、指定した正規表現

基本的に私はそれが正反対の方法で動作する必要があります - 指定された正規表現はすべて置き換えます。私は無駄な先読みでそれをやろうとしてきました。あなたの特定のタスクのために

+3

をサンプルテキストと期待される出力を提供してください。今のところ、https://ideone.com/e6gUWgが必要なだけのように聞こえます。 –

+0

私はxmlを持っています。たとえば、 などと書かなければなりません。 name = "foo" "とマッチャーを使用しない方が良いでしょう – Kirill

+0

エンジンでどんな速度で使用されても' Matcher'を使用しないのはなぜですか? –

答えて

2

、私は

getStringFromDom(doc).replaceAll(".*?(contract=\"\\d*\"|name=\"\\p{L}*\").*", "$1"); 

はあなたが必要なものをやるべきだと思います。

+1

'contract'属性と' name'属性の両方がある場合、この方法は1つの属性を削除するので機能しません。 –

+0

これはうまくいきますが、1行だけで他のすべてを置き換える方法はありますか? – Kirill

1

パターンに一致しないものはすべて削除します。これは単にパターンマッチをフィルタリングするのと同じです。正規表現を使用してそのパターンの一致を見つけ、文字列ビルダで一致を収集します。

+0

これは正しいですが、私はWiktorStribiżewの解決策を取ってきましたが、少し修正しました。 Matcherは私がここで使いたかったものです。 – Kirill

1

あなたが探していないものを削除することは、二重否定であるとも考えています。あなたが探しているものに集中し、パターンマッチングを使用してください。この例では、任意の名前のためにあなたの文書を検索属性:

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

public class Test { 
    public static void main(String[] args) { 
     String input = "<AnotherDoc accNum=\"1111\" docDate=\"2017-09-26\" docNum=\"2222\" name=\"foo\"> <anotherTag>some date</anotherTag>"; 

     Pattern pattern = Pattern.compile("name=\"[^\\\"]*\""); // value are all characters but " 
     Matcher matcher = pattern.matcher(input); 

     while (matcher.find()) 
      System.out.println(matcher.group()); 
    } 
} 

をこれは印刷します

name="foo"