6

これを試してみたら

(import java.util.regex.Pattern)
(Pattern/compile ")!@#$%^&*()")

またはこれ

(def p #")!@#$%^&*()")

私はClojureに、比類のない/閉じられていないものがあると不平を言ってい)ます。この単純な文字列内で角かっこが評価されるのはなぜですか?それらを脱出する方法は?ありがとう

編集:エスケープはclojure固有の構文(#"")で機能しPattern/compileますが、文字列から正規表現パターンを動的にコンパイルする必要があるため、必要な構文では機能しません。

で試しましたre-patternが、何らかの理由で適切に脱出できません。

(re-pattern "\)!@#$%^&*\(\)")
    java.lang.Exception: Unsupported escape character: \)
    java.lang.Exception: Unable to resolve symbol: ! in this context (NO_SOURCE_FILE:0)
    java.lang.Exception: No dispatch macro for: $
    java.lang.Exception: Unable to resolve symbol: % in this context (NO_SOURCE_FILE:0)
    java.lang.IllegalArgumentException: Metadata can only be applied to IMetas

編集2この小さな関数は役立つかもしれません:

(defn escape-all [x]
    (str "\\" (reduce #(str  %1 "\\" %2) x)))
4

3 に答える 3

12

すべてをダブルエスケープすることで機能しました。ああ、ダブルエスケープの喜び。

=> (re-pattern "\\)\\!\\@\\#\\$\\%\\^\\&\\*\\(\\)")
=> #"\)\!\@\#\$\%\^\&\*\(\)"

=> (re-find (re-pattern "\\)\\!\\@\\#\\$\\%\\^\\&\\*\\(\\)")
            ")!@#$%^&*()")
=> ")!@#$%^&*()"

文字列を受け取り、必要なものすべてをダブルエスケープしてから呼び出すヘルパー関数str-to-pattern(またはそれを呼び出したいもの) を作成することをお勧めre-patternします。

編集: 文字列をパターン関数
にする これを行う方法はたくさんありますが、以下はほんの一例です。まず、正規表現エスケープ文字から文字列置換への smap を作成します。「smap」は実際のタイプではありませんが、機能的には「古い値」を「新しい値」と交換するために使用するマップです。「古い値」は smap のキーのメンバーであり、「新しい値」は「新しい値」です。 smap の vals の対応するメンバーです。この場合、この smap は次のようになり{\( "\\(", \) "\\)" ...}ます。

(def regex-char-esc-smap
  (let [esc-chars "()*&^%$#!"]
    (zipmap esc-chars
            (map #(str "\\" %) esc-chars))))

次は実際の機能です。上記の smap を使用して、渡された文字列内の項目を置き換え、それを文字列に変換して、そこから正規表現パターンを作成します。マクロによってコードが読みやすくなると思います->>が、それは単なる個人的な好みです。

(defn str-to-pattern
  [string]
  (->> string
       (replace regex-char-esc-smap)
       (reduce str)
       re-pattern))
于 2012-07-26T15:14:26.263 に答える
3

エラーがリーダーからのもの(つまり、clojure自体からのもの)であると確信していますか?

正規表現は括弧を使用し、そこでも一致する必要があります。エラーは、正規表現をコンパイルしようとしているコードから発生していると思います。

正規表現でパレンをエスケープする場合は、バッククォートを使用します。(def p #"\)!@#$%^&*\(\)")

[更新]ああ、すみません、おそらくオムリの日として二重の脱出が必要です。

于 2012-07-26T14:53:34.350 に答える