正则表达式,具有特定字符的出现次数受限

时间:2015-06-05 21:25:29

标签: java regex

我在编写匹配的正则表达式时遇到了麻烦:

  • 包含来自a-z但字符k&的字符的单词p不得超过一次。

3 个答案:

答案 0 :(得分:0)

您可以使用以下内容:

^[a-jl-oq-z]*(k|p)?[a-jl-oq-z]*(?!\1)(k|p)?[a-jl-oq-z]*$

请参阅DEMO

说明:

  • [a-jl-oq-z]*匹配kp
  • 以外的任何内容
  • (k|p)?匹配kp并在群组1中捕获
  • [a-jl-oq-z]*匹配kp
  • 以外的任何内容
  • \1表示对已捕获的论坛1的回复引用(( )
  • (?!\1)表示对已捕获的群组1采取否定的预测(这将确保捕获的kp中的任何一个都不再重复)。

答案 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