我在编写匹配的正则表达式时遇到了麻烦:
a-z
但字符k
&的字符的单词p
不得超过一次。答案 0 :(得分:0)
您可以使用以下内容:
^[a-jl-oq-z]*(k|p)?[a-jl-oq-z]*(?!\1)(k|p)?[a-jl-oq-z]*$
请参阅DEMO
说明:
[a-jl-oq-z]*
匹配k
和p
(k|p)?
匹配k
或p
并在群组1
中捕获[a-jl-oq-z]*
匹配k
和p
\1
表示对已捕获的论坛1
的回复引用(( )
)(?!\1)
表示对已捕获的群组1
采取否定的预测(这将确保捕获的k
或p
中的任何一个都不再重复)。答案 1 :(得分:0)
这可能有效 - (?<![a-z])(?![a-z]*k[a-z]*k)(?![a-z]*p[a-z]*p)[a-z]+
扩展:
(?<! [a-z] ) # Not [a-z] char behind
(?! [a-z]* k [a-z]* k ) # Not 2 k's in a word
(?! [a-z]* p [a-z]* p ) # Not 2 p's in a word
[a-z]+ # 1 or more [a-z] chars
答案 2 :(得分:0)
我将假设您的正则表达式旨在将预解析的单词作为输入进行操作,而不是从句子中挑选出单词。您希望确保从一般的低级字符集中省略“p”和“k”。
正则表达式:^[a-jl-oq-z]*(k?[a-jl-oq-z]*p?|p?[a-jl-oq-z]*k?)[a-jl-oq-z]*$
示例:
cat words.txt
a
k
p
kit
pit
tip
apt
kick
pork
tiki
word
work
kipper
wykkan
tommyRot
grep "^[a-jl-oq-z]*\(k\?[a-jl-oq-z]*p\?\|p\?[a-jl-oq-z]*k\?\)[a-jl-oq-z]*$" words.txt
a
k
p
kit
pit
tip
apt
pork
tiki
word
work