2016-03-29 7 views
0

私はテンプレートから構成ファイルを生成するために取り組んでいます。テンプレートは次のようになります。与えられた状況に正規表現を書く方法

$Country$$Country$ 
WAN$Country$/$Country$ 
$Country$/29 
$Country$/$Country$ 
"$fdfsrwdrdgf$1$asffdjhk" 

これは単なるサンプルにすぎません。私は2つの間の何かをプレースホルダーとして考える。$上記の例では、Countryは私が必要とする唯一のプレースホルダです。今

{"\\$[^$]*\\$";} 

は、私が持っている問題は、私は上記のREと認識されるように引用符の内側に何もしたくない、というか私はREなどを変更したい:私は、Javaコードで以下の正規表現を使用しています引用符( "")の内容は無視されます。誰もそれで私を助けてくれますか?

+2

['(? "[^"] + ")|( \ $ [^ $] * \ $)'](https://regex101.com/r/xE7wA4/1) –

答えて

3

あなたはBest Trick Everを使用することができます。

あなたは私たちは、二重引用符で囲まれたものを除き、ターザンのすべてのインスタンスに一致するようにしようとしたシンプルなケースを覚えている...さて、あなたは今、どのようにシンプルな表示されます?本当に

"Tarzan"|(Tarzan)

:あなたが今まで最高の正規表現のトリックを使用する場合に問題となりますか?それでおしまい?

はい。そのトリックは、です。私たちは、交代の左側にしたくないものと一致します|)、私たちは右にほしいと思うものをキャプチャします。プログラミング言語が結果を返すとき、私たちは全体のマッチ(ゴミ箱)を無視し、その後、私たちが行ったことを含むグループ1のマッチに全面的な注目を向けます。だから、

あなたはシーケンスエスケープしている場合、あなたが必要とするすべては

"[^"]+"|(\$[^$]*\$) 

か(ある:。

"[^"\\]*(?:\\.[^\\"]*)*"|(\$[^$]*\$) 

をさらにキャプチャグループ#1の内容を取得regex demoを参照してください

Demo

String s = "$Country$$Country$\nWAN$Country$/$Country$\n$Country$/29\n$Country$/$Country$\n\"$fdfsrwdrdgf$1$asffdjhk\""; 
Pattern pattern = Pattern.compile("\"[^\"\\\\]*(?:\\\\.[^\\\\\"]*)*\"|(\\$[^$]*\\$)"); 
Matcher matcher = pattern.matcher(s); 
List<String> res = new ArrayList<>(); 
while (matcher.find()){ 
    if (matcher.group(1) != null) { 
     res.add(matcher.group(1)); 
     //     ^- Get Group 1 only! 
    } 
} 
System.out.println(res); 
// => [$Country$, $Country$, $Country$, $Country$, $Country$, $Country$, $Country$] 
+0

このトリックは魔法と似ています! – Quinn

+1

ありがとうそのような詳細な説明のためにそれは働く! – sahana