2014-04-20 2 views
4

에서 대소 문자를 구분 필터가 즉, (list-data ["Lion" "Zebra" "Buffalo" "Antelope"] "a")은 다음을 반환합니다.나는이 기능을 Clojure의/ClojureScript

;=> ("Zebra" "Buffalo" "Antelope") 

감사합니다.

(이것은 .cljs 파일에서 작업해야합니다) 당신이 일반적으로 정규 표현식이 할 것 Clojure의 자체에서

+0

@Thumbnail 감사합니다. 좋은 캐치! – leontalbot

답변

13

. 자바 정규 표현식에서 당신은 당신이 만드는, 또는 글로벌 소문자 구분 사용에 대한 정규식의 시작 부분에 원하는 경기를보기 위해 소문자 구분 사용에 대한 플래그에 제공하여이 작업을 수행 할 수 있습니다 :

(filter #(re-find #"(?i)a" %) 
      ["Lion" "Zebra" "Buffalo" "Antelope"]) 

순수 자바 스크립트 정규 표현식 만 글로벌 플래그를 지원합니다. 그들은 정규식 생성자에 두 번째 매개 변수로 문자열로 주어진다 : 편의와 유사한 자바와 자바 스크립트의 정규 표현식에를 유지하는,

(filter #(re-find (js/RegExp. "a" "i") %) 
      ["Lion" "Zebra" "Buffalo" "Antelope"]) 

그러나, Clojurescript 리더는 시작에 그 글로벌 자바 스타일의 플래그 (변환 정규식의)를 해당 자바 스크립트에 맞게 변환합니다.

첫 번째 예는 Clojurescript에서도 작동합니다. Clojure에서 작동하지 않는 Clojurescript에서는 비 전역 플래그가 작동하지 않는다는 것을 알고 있어야합니다.

+0

Javascript 정규 표현식은 인라인 수정 자 플래그 (즉,'(? i)')를 지원하지 않습니다. – amalloy

+0

내가 읽은 Clojurescript reader에서 자바 타입 인라인 플래그 – NielsK

+1

을 지원합니다. https://github.com/clojure/clojurescript/blob/master/src/clj/cljs/compiler.clj#L192-L196은 정규식의 시작 부분에서 발견되는 모든 인라인 플래그를 취해 대신 전역 플래그를 사용합니다. 따라서 실제로는 인라인을 변경할 수 없습니다 (자바 스크립트에서 지원되지 않기 때문에).하지만 글로벌 플래그가 필요한 경우 clojure와 비슷한 구문을 사용할 수 있습니다. – amalloy

4
(defn list-data [alist filter-text] 
(if-let [filter-text (some-> filter-text not-empty .toLowerCase)] 
    (filter #(-> % 
       .toLowerCase 
       (.indexOf filter-text) 
       (not= -1)) 
      alist) 
    alist)) 
+0

감사합니다. 이 예제에서도 잘 작동합니다. http://stackoverflow.com/questions/23179779/how-to-filter-a-list-based-on-user-input-with-clojurescript-and-om @ Nielsk의 대답보다 자세한 내용. – leontalbot

관련 문제