regex expression - 指定字符串中重复字符值的数量

时间:2010-08-25 16:34:12

标签: java regex

如何检查发生一定次数的模式?

例如:

4444444 => return 4

4444332 => return 4

4444431 => return 4

4443333 => return 0

4243424 => return ?

但如果字符4少于4次,则返回0

我只是在这里寻找4。如果它看起来大于或等于4次,那么返回的值将是4.字符串中的其他3个数字的范围仅为1到3。

谢谢。

5 个答案:

答案 0 :(得分:2)

要检查1到4之间的4个连续相同的数字,您可以使用正则表达式:

([1-4])\1{3}

答案 1 :(得分:2)

如果您需要连续四个4,则只需4{4}4444。如果他们不需要连续,4.*4.*4.*4将会这样做。如果它可以是任意数字,但必须是四次,那么([1-4])\1{3}([1-4]).*\1.*\1.*\1取决于您是否需要连续或不连续。

答案 2 :(得分:2)

看起来^[1-3]*4[1-3]*4[1-3]*4[1-3]*4[1-4]*$是您基本需要的。

匹配'4' 4次数字包围的数字。最后一种情况基本上是说,在4次匹配4次之后,可以有任何数字1-4直到字符串的结尾。这适用于您上面建议的模式。上述表达式的问题在于,如果出现故障,并且您的字符串很长(> 100个字符),那么您可以使用所谓的Catastrophic Backtracking(请参阅下面的评论......)。为避免这种情况,您需要占有匹配器,或更常用的独立子表达式。这看起来像(注意,您也可以使用占有性匹配器*+等):

^(?>[1-3]*)4(?>[1-3]*)4(?>[1-3]*)4(?>[1-3]*)4(?>[1-4]*)$

答案 3 :(得分:0)

然后,计算模式:

public static void main(String[] args)
{
    String input = "44444123444441234444";
    Pattern pattern = Pattern.compile("4444");
    Matcher matcher = pattern.matcher(input);
    int count = 0;
    int lookupPosition = 0;

    while (matcher.find(lookupPosition))
    {
        count++;
        lookupPosition = matcher.start() + 1;
    }

    System.out.println(count);
}

答案 4 :(得分:0)

您可以使用模式"(4[^4]*){4}"

  List<String> inputs = Arrays.asList("4444444", "4444332", "4443333", 
      "4243424", "4444431");
  Pattern pattern = Pattern.compile("(4[^4]*){4}");
  for(String input: inputs) {
    Matcher matcher = pattern.matcher(input);
    System.out.printf("Min 4 fours in '%s'? %b\n", input, matcher.find());
  }

输出:

Min 4 fours in '4444444'? true
Min 4 fours in '4444332'? true
Min 4 fours in '4443333'? false
Min 4 fours in '4243424'? true
Min 4 fours in '4444431'? true