我打算在Java中使用REGEX来匹配String。因为我有字母'A' 'A' 'A' 'P' 'P' 'L' 'E' 'S'
。
我想检查字符串是否包含0-3 'A', 0-2 'P', 0-1 'L', 0-1 'E' and 0-1 'S'
。
应通过检查的字符串示例:
APPLE, APPLES, ALE, PALE... etc
这是我尝试过的:
if (str.matches("[A]{0,3}[P]{0,3}[L]{0,1}[E]{0,1}[S]{0,1}"))
APPLES 成功通过了检查,但没有 SAPPLE 。
答案 0 :(得分:3)
(?!(.*A){4,})(?!(.*P){3,})(?!(.*L){2,})(?!(.*E){2,})(?!(.*S){2,})^[APLES]*$
试试这个。这对你有用。见演示。
http://regex101.com/r/sH6aF3/2
它使用负向前瞻来确保
A
不应该出现4次或更多次。类似于前瞻的其余部分确保其他条件。最后,当它消耗字符串的时间时,只允许[]
内的所选字符。
答案 1 :(得分:2)
vks's regex的优化版本:
^(?!(?>[^A]*A){4})(?!(?>[^P]*P){3})(?!(?>[^L]*L){2})(?!(?>[^E]*E){2})(?!(?>[^S]*S){2})[APLES]*$
的变化:
^
锚点移至前方。[^A]*A
等等代替.*
回溯来有效地滚动比赛。这是regex demo。
答案 2 :(得分:1)
您正在对您的信件强制执行特定订单(在Q之前的E之前的L之前的A之前,APPLES
通过而不是SAPPLE
的原因。实际上,我不确定你想要做什么,甚至可以使用相当短的正则表达式。我会手动使用单个循环和Map来计算出现次数。