如何使用Java中的正则表达式(Pattern)识别包含多于非数字的数字的字符串?谢谢。
答案 0 :(得分:12)
这不是一种常规语言,因此它不能被香草正则表达式捕获。无论如何,它可能是可能的,但几乎可以肯定不使用正则表达式:
public static boolean moreDigitsThanNonDigits(String s) {
int diff = 0;
for(int i = 0; i < s.length(); ++i) {
if(Character.isDigit(s.charAt(i))) ++diff;
else --diff;
}
return diff > 0;
}
答案 1 :(得分:10)
您将无法编写执行此操作的正则表达式。但是你已经说过你正在使用Java,为什么不混合使用一些代码?
public boolean moreDigitsThanNonDigits(String input) {
String nonDigits = input.replace("[0-9]","");
return input.length() > (nonDigits.length * 2);
}
答案 2 :(得分:3)
正则表达式在概念上无法执行此类任务。它们相当于形式语言或(常规)自动机。它们没有内存(或堆栈)的概念,因此它们无法计算符号的出现次数。表达性方面的下一个扩展是下推自动机(或堆栈机器),它们对应于无上下文语法。在为此任务编写这样的语法之前,使用上面moreDigitsThanNonDigits
之类的方法是合适的。
答案 3 :(得分:1)
如上所述,有问题的语言不常规,无法使用正则表达式检测到。
我将再给你一个使用正则表达式计算字符串中数字位数和非数字位数的方法!!
您可以使用String.replaceAll
方法删除输入字符串中的所有非数字。结果字符串的长度将是输入中的位数。
类似地,您可以删除输入字符串中的所有数字,结果字符串的长度将是输入字符串中的非数字位数。
public static boolean test(String str) {
int numDigits = str.replaceAll("\\D","").length();
int numNonDigits = str.replaceAll("\\d","").length();
return numDigits > numNonDigits;
}
答案 4 :(得分:0)
我不确定使用正则表达式是否是最佳解决方案。
答案 5 :(得分:0)
当然,我宁愿使用戴夫的答案。