2012-06-20 3 views
3

Есть ли какое-нибудь регулярное выражение, которое можно передать повторно, так что оно будет вести себя как .split?Может ли re-seq заставить себя вести себя как .split?

user=> (seq (.split "a,b,c,,e" ",")) 
("a" "b" "c" "" "e") 
user=> (re-seq #"[^,]" "a,b,c,,e") 
("a" "b" "c" "e") 
user=> 

Как вы можете видеть, что регулярное выражение [^,] не вполне приемлемым, поскольку он не будет забрать на пустых столбцов в файл с разделителями. Я застрял с .split или может сделать re-seq?

+1

Почему вы предпочитаете использовать повторно, когда раскол SEQ работает нормально? –

+0

@MichielBorkent: Ну, я закончил использование '.split'. Но все это началось, когда я выполнял проект cascalog, и я хотел использовать метод «re-parse» cascalog для разделения текста с разделителями табуляции (потому что он выглядел так, как будто он предназначался для такого рода вещей). И столбцы были сброшены с входа, и cascalog выкапывал, потому что я сказал, что мой генератор выпустил 7 столбцов, и вместо этого он создавал 5 столбцов для некоторых строк. И это было потому, что 're-parse' реализован с помощью' re-seq'. Поэтому в конечном счете я использовал '.split', но было просто любопытно. – Kevin

ответ

6

Попробуйте

(re-seq #"[^,]+|(?<=,)(?=,)" "a,b,c,,e") 

Я надеюсь, что Clojure поддерживает регулярные выражения утверждения 'назад.

Объяснение:

[^,]+  # Either match one or more non-comma characters 
|   # or 
(?<=,)(?=,) # match the empty string between two commas 
+0

Фактически это приводит к '(" a "" "" b "" "" c "" "" "" e "" ")', что определенно ближе, но не совсем. – Kevin

+0

, хотя я ожидал бы, что вы предоставили для работы, это имеет смысл. – Kevin

+0

@Kevin: Спасибо, что заметили это (RegexBuddy автоматически отфильтровывает эти дополнительные пустые совпадения, но реализация реализаций большинства языков программирования не имеет смысла. Это имеет смысл: ведь после согласования 'a', механизм регулярных выражений может найти нуль не запятыми перед следующей запятой ...). Я переписал мое регулярное выражение, вы можете попробовать новый? –

Смежные вопросы