如何检查发生一定次数的模式?
例如:
4444444 => return 4
4444332 => return 4
4444431 => return 4
4443333 => return 0
4243424 => return ?
但如果字符4
少于4次,则返回0
我只是在这里寻找4
。如果它看起来大于或等于4次,那么返回的值将是4.字符串中的其他3个数字的范围仅为1到3。
答案 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