Меня попросили найти набор слов, которые начинаются с подстроки длиной 3, содержащей символы a, b и c, и которая дополнительно содержит другую непересекающуюся подстроку, содержащую те же 3 символа.
напр. abcacb acbbac
Помогите мне найти регулярное выражение для этого. Спасибо
правка: abcbac - a, b, c должны быть первыми тремя буквами, затем a, b, c должны изменить свой порядок по сравнению с предыдущими тремя буквами. Всего 6 строк символов.
acbbca abccba bacbca и т. д....
решение1
(Решения здесь предполагают, что GNU grep
собран с поддержкой PCRE (как это обычно бывает в cygwin)).
Первая половина ваших требований будет означать.
grep -Pwo '(abc|acb|bac|bca|cab|cba)\w*(?1)\w*'
Или, возможно:
grep -Pwo '(abc|acb|bac|bca|cab|cba)\w*\1\w*'
Вторая половина, которая, кажется, противоречит первой:
grep -Pwo '(abc|acb|bac|bca|cab|cba)(?!\1)(?1)'
Найду ли яслова(словов данном случае определяется как последовательность [a-zA-Z0-9_]
символов), которая начинается с последовательности из 3 символов, состоящих из a
, b
и c
(по одному из каждого), за которыми следует еще одна из таких последовательностей ( (?1)
ссылаясь на то же регулярное выражение, что и в первой (...)
группе), при условии, что она не совпадает с первой ( \1
ссылается на строку, которая сопоставлялась с первой (...)
группой захвата и (?!...)
являетсянегативный взгляд впередоператор).
$ echo abcbca abcbcax abcabc aaabbb xcabacb abcacb-blah |
grep -Pwo '(abc|acb|bac|bca|cab|cba)(?!\1)(?1)'
abcbca
abcacb
решение2
Это должно сработать:
grep -Ew '[a-c]{3}.*[a-c]{3}'
-E
для сопоставления регулярных выражений-w
для соответствия только словам[a-c]{3}
будет соответствовать ровно 3 символам изa-c
набора.*
будет соответствовать всему между