2016-08-01 6 views
1

私はこの文字列パターンを持っています。 2つの中括弧で囲まれたいくつかの単語を含むことができます。これらの中括弧は整形式でなければならず、入れ子にすることはできません。例えば不必要に長い正規表現

:私は動作するようですが、それは非常に長いですし、私はそれを簡略化することができると思い、この正規表現を構築した

I have this {{example}} which is right 
Here {{is}} another {{example}} which is right 
{{ This {{ example }} is wrong }} 
{{ This }}example {{ is also { wrong }} 

"^([^{}]*\\{\\{([^{}]*)\\}\\}[^{}]*)+$"

私はこれを簡素化することができます方法はありますか?

+0

あなたはどのような簡素化を求めていますか?文字クラスの中から '' \ ''を取り除きます*と*すべての遅延量指定子はここで同じように動作するため、欲張りになります(http://ideone.com/kJeHM6参照)。 –

+0

@WiktorStribiżewうわー、私はそれを修正しました。私はそのこと以外に簡略化を意味しました – Ogen

+0

上記のコメントを更新しました。すべての '*?'を '*'に変更することもできます。 –

答えて

2

否定一致の方が簡単です。つまり、許可されていないものを探してください:

\\{\\{[^}]*\\{ 

と使用Matcher.find()です。 regex against XML is problematicを使用して同じ理由で正の一致でこれを行うことは困難です。

あなたは、これが

\\{\\{(\\w+\\)}\\} 
+0

'' {{} [{] [{] \\ w + [}] [}] ' – Harald

+1

@ハラルドで囲んで保存する\\; – JimmyJames

1

を十分なはずである括弧の内容をつかむしたい場合はあなたが「パターンがよりシンプルにする」によって何を意味するかは明らかではありません。良いパターンは長いと知られています。より短い正規表現は、まったくです。あなたのケースでは

、あなたは(あなたが私の最初のコメントの後にあることを固定)文字クラスの内部{}記号でエスケープ使用しないでください、とあなたが撮影した値を使用しているない限り、あなたは表現内部怠惰な数量を必要としませんいくつかのさらなる処理のために。しかし、あなたはそれらを使用するように見えるので、使用しないでください。

"^([^{}]*\\{\\{([^{}]*)\\}\\}[^{}]*)+$" 

Java demoを参照してください:

String s = "I have this {{example}} which is right"; 
Pattern pattern = Pattern.compile("^([^{}]*\\{\\{([^{}]*)\\}\\}[^{}]*)+$"); 
Matcher matcher = pattern.matcher(s); 
if (matcher.matches()){ 
    System.out.println(matcher.group(0)); 
}