2017-08-23 1 views
1

に空白文字を削除します。だから私はそれを変更します。Clojureの正規表現は、私は特別な接頭辞から文を選択するパターン

(re-find (re-pattern (str "(?<=" "\\+" "+:=\\s*)" ".+")) "++:= test test") 
=>nil 

が、このコードは動作します:

(re-find (re-pattern (str "(?<=" "\\+" "+:=\\s)" ".+")) "++:= test test") 
=> "test test" 

test test前に実際に、だけでなく、そこにある(あまりにも多分なし)1つの空白、私はよく、なぜ\\s仕事を知りません\\s*はありません。

このコードではどうなりますか?どうすれば修正できますか?

+0

なぜあなたは、部分文字列の部分は、なぜだけではなく、単一の文字列に正規表現を破るのですか? – sln

+0

組み込みのregex構文を使うことができます: '#"(?<= \ ++:= \ s)。+ "'。これは 'java.util.regex.Pattern'を生成するので、' re-pattern'を呼び出すのと同じです。 –

+0

中間キーワードが将来変更される可能性があるため、正規表現を部分文字列に分割します。 "\\ +"は " - "または他の一意の記号にすることができます。 – ccQpein

答えて

1

編集:あなたは可変幅lookbehindsに
を行い幸運エンジンを持っている場合は、他のエンジンについては(?<=\++:=\s*)(?!\s).+


を使用して否定先読み
に貼り付けて作業することを強制することができます。

\s*は、可変数の空白に一致します。
\++は、可変数のプラス記号に一致します。

Dot-Net regexエンジンを除くすべてでは、を使用しないでください。は、可変幅を見かけのアサーションに使用できません。

だからこの(?<=\++:=\s*)はエラーを投げます。つまり、コンパイルされません。

私はこれを回避する通常の方法は、それを参照し、その後、何が必要取得することです...


あなたはdon't workによって何を意味するかわかりません。
\++:=\s*(.+)

** Grp 0 - (pos 0 , len 14) 
++:= test test 
** Grp 1 - (pos 5 , len 9) 
test test 
+0

ありがとうございます!私はloosbehindアサーションが変数を許さないことは知らない。私はそれがうまくいくと思ったので、私は「働かないでください」と言いました。 – ccQpein