2017-04-12 5 views
1

正規表現関数/パターンマッチャーで使用する文字列から2倍のドルをエスケープするのに問題があります。ドルをエスケープする

これは、文字列の一部です:

WHERE oid_2 = $$test$$ || oid_2 = $$test2$$ 

、これは私が解決策の近くに取得しようとした最も近いコードです:

List<String> strList = new ArrayList<String>(); 
Pattern pattern = Pattern.compile("\$\$.*?\$\$"); 
log.debug("PATTERN: "+pattern) 
Matcher matcher = pattern.matcher(queryText); 
while (matcher.find()) { 
    strList.add(matcher.group()); 
} 
log.debug(strList) 

これは私が

を取得デバッグ出力であります
- PATTERN: $$.*?$$ 
- [] 

パターンは実際に正しいですが、プレースホルダは文字列に見つかりません。

テストとして、 "$$ test $$"を "XXtestXX"に置き換えようとしましたが、すべてが完全に機能します。私は何が欠けていますか?私は "/ $"文字列 "\\"を試しましたが、解決策はまだありません。

+0

https://ideone.com/Olm30x –

+0

「\\ $ \\ $。*?\\ $ \\ $」はドル記号の後の不正な文字列の本文文字を示します。解決策:リテラルドル記号 "¥$ 5"をエスケープするか、値式 "$ {5}" @行7、列38をかっこで囲みます。Pattern pattern = Pattern.compile( "\\ $ \\ $。*?\\ $ \\ $ ")^ 1エラー – GiLA3

+0

Slashyの文字列を使用している間は動作します!ありがとう、私はその解決策を試みたと確信していたが、何とかしなかった、もう一度感謝! – GiLA3

答えて

1

正規表現内の$が文字列の最後に一致することに注意してください。リテラル$シンボルとして使用するには、リテラルバックスラッシュでエスケープする必要があります。

$$.*?$$のようなリテラル文字列に変換された文字列は、文字列の2つの終わりに一致する0個以上の文字とできるだけ少ない文字列に変換されています。実際には、Groovyで二重引用符で囲まれた文字列リテラルに変数を挿入するために最初に使用される$をエスケープし、2つのバックスラッシュを使用してリテラル・バックスラッシュ-を定義するバックスラッシュが必要です。

しかし正規表現を使って作業するときは、特別な文字をエスケープするために必要なものはすべて単一のバックスラッシュであるため、スラッシュ文字列は非常に便利です。ここで

は、あなたがGroovyで持っている文字列からすべての一致を抽出するサンプルコードです:

def regex = /\$\$.*?\$\$/; 
def s = 'WHERE oid_2 = $$test$$ || oid_2 = $$test2$$' 
def m = s =~ regex 
(0..<m.count).each { print m[it] + '\n' } 

online demoを参照してください。

+0

同じ名前のプレースホルダごとに変数がある場合、その値をどのように置き換えるのですか?たとえば、私はString test = "1"とString test2 = "2"を持っています。すべての$$ test $$を "1"に置き換え、すべての$$ test2 $$を "2"に置き換えるのが最も簡単な方法は何ですか?私はそれが明確であることを願っています – GiLA3

+0

変数を(名前で)それらの値に置き換える必要がありますか? [これのようなものではありません](https://ideone.com/mBpDWO) –

+0

文字列の中に文字列がある場合は、[これと似たようなもの](https://ideone.com/tmdGut)を使います。 –

関連する問題