我被要求找到以长度为 3 的子字符串开头的单词集,其中包含字符 a、b 和 c,并且还包含另一个包含相同 3 个字符的不相交子字符串
前任。 abcacb abcbac
帮我找到一个正则表达式。谢谢
编辑: abcbac - a、b、c 应该作为前 3 个字母,然后 a、b、c 应该更改前 3 个字母的顺序。只有 6 个字符串。
acbbca abccba bacbca 等等......
答案1
(此处的解决方案假设grep
使用 PCRE 支持构建 GNU(通常是 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}
将恰好匹配a-c
集合中的 3 个字符.*
将匹配之间的任何内容