Java 某些字符出现次数受限的word的正则表达式

Java 某些字符出现次数受限的word的正则表达式,java,regex,Java,Regex,我在编写与以下内容匹配的正则表达式时遇到问题: 包含a-z字符但包含k字符和p字符的单词不能出现多次 您可以使用以下功能: ^[a-jl-oq-z]*(k|p)?[a-jl-oq-z]*(?!\1)(k|p)?[a-jl-oq-z]*$ 看 说明: [a-jl-oq-z]*匹配除k和p (k | p)匹配k或p并在组1 [a-jl-oq-z]*匹配除k和p \1表示返回对捕获组的引用1(带()) (?!\1)表示捕获的组1(这将确保捕获的k或p不会再次重复) 这可能有效-( 扩大: (?

我在编写与以下内容匹配的正则表达式时遇到问题:

  • 包含
    a-z
    字符但包含
    k
    字符和
    p
    字符的单词不能出现多次

您可以使用以下功能:

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

说明:

  • [a-jl-oq-z]*
    匹配除
    k
    p
  • (k | p)
    匹配
    k
    p
    并在组
    1
  • [a-jl-oq-z]*
    匹配除
    k
    p
  • \1
    表示返回对捕获组的引用
    1
    (带
    ()
  • (?!\1)
    表示捕获的组
    1
    (这将确保捕获的
    k
    p
    不会再次重复)
这可能有效-

扩大:

 (?<! [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

(?我假设您的正则表达式是用来操作预解析的单词作为输入,而不是从句子中挑选一个单词。您要确保从小写字符的常规集合中省略“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

这几乎成功了。测试字符串是“快速棕色狐狸跳过懒狗弹出踢”。结果集是{he,quick,brown,fox,jumps,over,The,lazy,dog}。我想OP不会想要“The”成为结果集的一部分。您可以删除lookback并将其余内容包装在\b\b或^$。@phatfingers-我为什么要这样做?@Shar1er80-我专门放了一个
(?有。据我所知,当有人在他们的问题中说
word
时,它意味着
boundary
。但是有很多边界,各种边界。但他没有具体说明。
(是我选择的一个,但可能是
)(?或者集合中的数千个其他字符
[^a-z]
@sln所以如果你遇到“Kick”你和“ick”不匹配。