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”不匹配。