Меня попросили найти набор слов, которые начинаются с подстроки длины 3 содержащие символы a, b и c и которые дополнительно содержит другую непересекающуюся подстроку, содержащую те же 3 символы
напр. abcacb acbbac
поможет мне найти для этого регулярное выражение. Спасибо
редактировать: abcbac - a, b, c должны быть там как первые 3 буквы, затем a, b, c должны изменить свой порядок по сравнению с предыдущими 3 буквами. всего 6 символьных строк.
acbbca abccba бакбка и т.д ....
Это должно сделать это:
grep -Ew '[a-c]{3}.*[a-c]{3}'
-E
для соответствия регулярным выражениям - w
для соответствия только словам[ac]{3}
будет соответствовать ровно 3 символам из набора ac
.*
будет соответствовать любому символу между (Решения здесь предполагают 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