在Java for String类中有一个名为matches的方法,如何使用此方法检查我的字符串是否只使用正则表达式的数字。我试着用下面的例子,但结果都是假的。
String regex = "[0-9]";
String data = "23343453";
System.out.println(data.matches(regex));
String regex = "^[0-9]";
String data = "23343453";
System.out.println(data.matches(regex));
答案 0 :(得分:304)
尝试
String regex = "[0-9]+";
或
String regex = "\\d+";
根据Java 正则表达式,+
表示“一次或多次”,\d
表示“一位数”。
注意:“双反斜杠”是转义序列以获得单个反斜杠 - 因此,java String中的\\d
会为您提供实际结果:\d
< / p>
<强>参考文献:强>
Java Character Escape Sequences
编辑:由于其他答案中的一些混淆,我正在撰写测试用例,并会详细解释更多内容。
首先,如果您对此解决方案(或其他)的正确性存在疑问,请运行此测试用例:
String regex = "\\d+";
// positive test cases, should all be "true"
System.out.println("1".matches(regex));
System.out.println("12345".matches(regex));
System.out.println("123456789".matches(regex));
// negative test cases, should all be "false"
System.out.println("".matches(regex));
System.out.println("foo".matches(regex));
System.out.println("aa123bb".matches(regex));
问题1:是否有必要将^
和$
添加到正则表达式中,因此它与“aa123bb”不匹配?
否。在java中,matches
方法(在问题中指定)匹配完整的字符串,而不是片段。换句话说,没有必要使用^\\d+$
(即使它也是正确的)。请参阅上一篇负面测试用例。
请注意,如果您使用在线“正则表达式检查程序”,那么这可能会有不同的表现。要在Java中匹配字符串的片段,可以使用find
方法,在此处详细说明:
Difference between matches() and find() in Java Regex
问题2:此正则表达式是否也与空字符串""
匹配?
否。正则表达式\\d*
与空字符串匹配,但\\d+
不匹配。星号*
表示零或更多,而加号+
表示一个或多个。请参阅第一个负面测试用例。
问题3:编译正则表达式模式不是更快吗?
是。编译一次正则表达式模式确实更快,而不是每次调用matches
,因此如果性能影响很重要,那么Pattern
可以像这样编译和使用:
Pattern pattern = Pattern.compile(regex);
System.out.println(pattern.matcher("1").matches());
System.out.println(pattern.matcher("12345").matches());
System.out.println(pattern.matcher("123456789").matches());
答案 1 :(得分:33)
您也可以使用Apache Commons的NumberUtil.isNumber(String str)
答案 2 :(得分:8)
还有一个尚未发布的解决方案:
String regex = "\\p{Digit}+"; // uses POSIX character class
答案 3 :(得分:5)
Long.parseLong(data)
并捕获异常,它处理减号。
虽然数字位数有限,但实际上会创建一个可以使用的数据变量,我想这是最常见的用例。
答案 4 :(得分:5)
您必须允许多个数字(+
符号),如下所示:
String regex = "[0-9]+";
String data = "23343453";
System.out.println(data.matches(regex));
答案 5 :(得分:5)
使用正则表达式在性能方面成本很高。尝试将字符串解析为长值是低效且不可靠的,可能不是您所需要的。
我建议只是检查每个字符是否为数字,使用Java 8 lambda表达式可以有效地完成什么:
boolean isNumeric = someString.chars().allMatch(x -> Character.isDigit(x));
答案 6 :(得分:1)
根据Oracle的Java文档:
private static final Pattern NUMBER_PATTERN = Pattern.compile(
"[\\x00-\\x20]*[+-]?(NaN|Infinity|((((\\p{Digit}+)(\\.)?((\\p{Digit}+)?)" +
"([eE][+-]?(\\p{Digit}+))?)|(\\.((\\p{Digit}+))([eE][+-]?(\\p{Digit}+))?)|" +
"(((0[xX](\\p{XDigit}+)(\\.)?)|(0[xX](\\p{XDigit}+)?(\\.)(\\p{XDigit}+)))" +
"[pP][+-]?(\\p{Digit}+)))[fFdD]?))[\\x00-\\x20]*");
boolean isNumber(String s){
return NUMBER_PATTERN.matcher(s).matches()
}
答案 7 :(得分:0)
我们可以使用Pattern.compile("[0-9]+.[0-9]+")
或Pattern.compile("\\d+.\\d+")
。它们具有相同的含义。
模式[0-9]表示数字。与'\ d'相同。 '+'表示它出现的次数更多。 ''对于整数或浮点数。
请尝试以下代码:
import java.util.regex.Pattern;
public class PatternSample {
public boolean containNumbersOnly(String source){
boolean result = false;
Pattern pattern = Pattern.compile("[0-9]+.[0-9]+"); //correct pattern for both float and integer.
pattern = Pattern.compile("\\d+.\\d+"); //correct pattern for both float and integer.
result = pattern.matcher(source).matches();
if(result){
System.out.println("\"" + source + "\"" + " is a number");
}else
System.out.println("\"" + source + "\"" + " is a String");
return result;
}
public static void main(String[] args){
PatternSample obj = new PatternSample();
obj.containNumbersOnly("123456.a");
obj.containNumbersOnly("123456 ");
obj.containNumbersOnly("123456");
obj.containNumbersOnly("0123456.0");
obj.containNumbersOnly("0123456a.0");
}
}
输出:
"123456.a" is a String
"123456 " is a String
"123456" is a number
"0123456.0" is a number
"0123456a.0" is a String
答案 8 :(得分:0)
试试这部分代码:
void containsOnlyNumbers(String str)
{
try {
Integer num = Integer.valueOf(str);
System.out.println("is a number");
} catch (NumberFormatException e) {
// TODO: handle exception
System.out.println("is not a number");
}
}