1

文字列内の特定の位置 k (以下の例では k=3) でパターンを照合しようとしています。

私はもう試した

(re-seq #"^alex" (str (drop 3 "xxxalexandre")))

しかし、それは何にも一致しません ( => nil)

これを行うClojureの方法は何ですか? (私はClojure 1.4.0を使用しています)

別の方法としては、パターンを任意の場所に一致させることもできますが、その場合は、入力内でパターンが見つかった位置が必要になります。java.util.regex.Matcherインスタンスにアクセスせずにこれを行うことはできますか? (変更可能であるため、これは非常に悪いと言われています)

4

3 に答える 3

5

(str (drop 3 ...は である必要があります(apply str (drop 3 ...

しかし、使用する方が良いでしょうsubs

user=> (re-seq #"^alex" (subs "xxxalexandre" 3))
("alex")

または、必要に応じて、正規表現で 3 文字を入力します。

user=> (map second (re-seq #"^...(alex)" "xxxalexandre"))
("alex")

あなたのフォローアップのために、一致の場所を見つけるために、1つの方法(単純なケースの場合)は.indexOf結果で使用することです:

user=> ((fn [s p] (let [[m] (re-seq p s)] [m (.indexOf s m)])) "xxxalexandre" #"alex")
["alex" 3]
于 2013-01-31T19:11:05.247 に答える
4

(str (drop 3 "xxxalexandre"))何が返されるか見てみてください:

=> (str (drop 3 "xxxalexandre"))
"clojure.lang.LazySeq@a65bc80b"

dropはレイジーシーケンスを返すため、strの引数はレイジーシーケンスであり、返されるのはそのレイジーシーケンスの.toString、つまりオブジェクト参照の文字列です。

=> (drop 3 "xxxalexandre")
(\a \l \e \x \a \n \d \r \e)

=> (str (lazy-seq `(\a \l \e \x \a \n \d \r \e)))
"clojure.lang.LazySeq@a65bc80b"

apply怠惰なseqを実現し、コレクションを複数の引数としてstr関数に入れるために使用します。

=> (apply str (lazy-seq '(\a \l \e \x \a \n \d \r \e)))
"alexandre"

=> (apply str (drop 3 "xxxalexandre"))
"alexandre"

これで、正規表現が一致します。

=> (re-seq #"^alex" (apply str (drop 3 "xxxalexandre")))
("alex")
于 2013-01-31T19:26:54.567 に答える
2

正規表現の$は行末にマップされます..おそらく^alexが必要です

于 2013-01-31T18:53:23.697 に答える