Size: a a a

Clojure — русскоговорящее сообщество

2020 July 10

m

mksm in Clojure — русскоговорящее сообщество
Igor Levdansky
А у регекспов есть какой-нибудь флаг, чтобы в:
(re-seq #"cat cat" "cat cat cat")

находило ("cat cat" "cat cat") - одна подстрока с первого слова, другая со второго?
(cat( )?){2} или как то так
источник

OR

Oleg Roshchupkin in Clojure — русскоговорящее сообщество
(reduce
 (fn [acc i]
   (when-let [pos (clojure.string/index-of "cat cat cat" "cat cat" i)]
     (conj acc pos)))
 #{}
 (range (- (count "cat cat cat") (count "cat cat"))))
источник

T

The2lb3oz4dr10½grOfH... in Clojure — русскоговорящее сообщество
Igor Levdansky
(let [matcher (re-matcher #"cat cat" "cat cat cat")]
 (loop [acc (transient [])
        found (.find matcher)]
  (if found
    (let [res (.group matcher)
          pos (.start matcher)]
      (recur (conj! acc res)
             (.find matcher (inc pos))))
    (persistent! acc))))
Вот такое тебе не подходит?

(let [input "cat cat cat ! bar cat cat ! cat ! ! cat cat cat cat cat cat ! cat"
     search "cat cat"
     iter (take-while (comp (partial <= (count search)) count) (iterate rest input))]
 (->> iter
      (map (partial take (count search)))
      (filter (partial = (seq search)))
      (map str/join)))
источник

T

The2lb3oz4dr10½grOfH... in Clojure — русскоговорящее сообщество
Oleg Roshchupkin
(reduce
 (fn [acc i]
   (when-let [pos (clojure.string/index-of "cat cat cat" "cat cat" i)]
     (conj acc pos)))
 #{}
 (range (- (count "cat cat cat") (count "cat cat"))))
Или такое. Более императивно, быстрее должно быть
источник

IL

Igor Levdansky in Clojure — русскоговорящее сообщество
Там скорее именно регекспы нужны, сложнее выражение для поиска, я специально для простоты до "cat cat" упростил
источник

T

The2lb3oz4dr10½grOfH... in Clojure — русскоговорящее сообщество
Ну покажи какое в действительности
источник

T

The2lb3oz4dr10½grOfH... in Clojure — русскоговорящее сообщество
А то ты устраиваешь https://en.wikipedia.org/wiki/XY_problem
источник

m

mksm in Clojure — русскоговорящее сообщество
cat(?= cat) еще так можно
источник

ST

Sergey Trofimov in Clojure — русскоговорящее сообщество
The2lb3oz4dr10½grOfHedgehogs
Нет, регекспы так не работают. Они не находят один и тот же текст повторно
находят, если это явно указать
источник

ST

Sergey Trofimov in Clojure — русскоговорящее сообщество
Sergey Trofimov
находят, если это явно указать
lookahead, lookbehind
источник

T

The2lb3oz4dr10½grOfH... in Clojure — русскоговорящее сообщество
Sergey Trofimov
lookahead, lookbehind
Но возвращают они результат просто cat, а не cat cat
источник

T

The2lb3oz4dr10½grOfH... in Clojure — русскоговорящее сообщество
Но у него там не понятно что вместо cat и "сложнее выражение"
источник

m

mksm in Clojure — русскоговорящее сообщество
Если в скобки взять то в матче будет вся подстрока
источник

m

mksm in Clojure — русскоговорящее сообщество
Но лукахеды и лукбехайнды медленные
источник

T

The2lb3oz4dr10½grOfH... in Clojure — русскоговорящее сообщество
mksm
Если в скобки взять то в матче будет вся подстрока
Так? (cat(?= cat))
источник

m

mksm in Clojure — русскоговорящее сообщество
Да
источник

IL

Igor Levdansky in Clojure — русскоговорящее сообщество
The2lb3oz4dr10½grOfHedgehogs
Ну покажи какое в действительности
Нужно находить номера банковских карт вида <4 цифры><separator><4 цифры><separator><4 цифры><separator><4 цифры> (причем сепаратор должен быть один и тот же, используется backreference для него) или <8 цифр><separator><8 цифр> или <16 цифр>
источник

T

The2lb3oz4dr10½grOfH... in Clojure — русскоговорящее сообщество
mksm
Если в скобки взять то в матче будет вся подстрока
Нет
источник

T

The2lb3oz4dr10½grOfH... in Clojure — русскоговорящее сообщество
источник

m

mksm in Clojure — русскоговорящее сообщество
Упс :)
источник