如何匹配字符串中的特定字符n-m次

时间:2014-09-20 01:39:10

标签: java regex string

我打算在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

3 个答案:

答案 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来计算出现次数。