2017-10-20 19 views
3

を働いていない私は、文字列のJava /正規表現 - パターンの否定

shape="box", fontsize = "130"fontstyle= " ITALIC " fillcolor=red"; 

と意図したように、現在

shape="box" 
fontsize = "130" 
fontstyle= " ITALIC " 

と一致するパターン

"(([^\\s,]+)((\\s*)=(\\s*)\"(.+?)\"))" 

を持っています。

これらの一致する文字列を分離して配列に格納する必要があります。私が考えた最も簡単な方法はString.split(反転パターン)を使用していましたが、具体的なパターンの逆パターンを一致させることは、すべてですが、このパターンはです。これまでのところ、私のために働く方法は見つけられませんでした。何らかの理由で

、どちらも負の先読み、また

^((?!pattern).)*$ 

は(私はしばしば私の問題への解決策として、与えられた見てきました)作業をしているようです。

これを行う方法はありますか?私は今見ていませんか?

+0

最も簡単な方法は、配列の代わりにリスト内に見つかったデータを置くことです。必要に応じて、後でそのデータを配列に移動することができますが、通常、リストは扱いやすくなります。 – Pshemo

+0

マークアップノードの属性を解析しているようです。おそらくregexを使用せず、代わりにマークアップパーサを使用するほうがよいでしょう。 – Mena

+0

私は問題を抱えていましたが、私はregexpで解決しようとしましたが、今は2つの問題があります。悲しいが本当。このWebサービスを使用するようにしてください - https://regex101.com/ – degr

答えて

1

区切り文字のパターンを作成することは実用的ではありません。なぜなら、パターン外では偶数カウントを必要とするからです.Java正規表現では苦労します。

あなたの文字列は完璧な例です.1つのスペースは、括弧で囲まれた括弧で区切られています。それ以外の場合は、引用符で囲まれた値の一部です。

式をsplit()メソッドで使用するのに適したものにするのではなく、パターンマッチャーを作成して繰り返し呼び出すことで、文字列を一致するチャンクに解析します。 This Q&Aは非常に小さなコードでそれを行う方法を説明しています。

List<String> chunks = new ArrayList<>(); 
Matcher m = Pattern.compile("(([^\\s,]+)((\\s*)=(\\s*)\"([^\"]+)\"))") 
    .matcher("shape=\"box\", fontsize = \"130\"fontstyle= \" ITALIC \" fillcolor=\"red\";"); 
while (m.find()) { 
    chunks.add(m.group()); 
} 
+0

*「あなたの場合は区切り文字のパターンを作ることは実用的ではありません。私が今までに読んだ問題の –