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));
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));
尝试
String regex = "[0-9]+";
或者
String regex = "\\d+";
+
表示“出现一次或多次”,\d
表示“数字”。\\d
将给出实际结果:\d
参考资料:编辑:由于其他答案存在一些混淆,我正在编写一个测试用例,并会详细解释一些事情。
首先,如果您对此解决方案(或其他解决方案)的正确性有疑问,请运行此测试用例:
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));
在正则表达式中加入
^
和$
是不是必要的,这样它就不会匹配到"aa123bb"了?
不需要。 在Java中,matches
方法(在问题中指定)匹配整个字符串,而不是片段。换句话说,使用^\\d+$
并不是必要的(即使它也是正确的)。请参见最后一个负测试用例。
请注意,如果您使用在线“正则表达式检查器”,则可能会有所不同。要在Java中匹配字符串的片段,可以使用find
方法,详细描述如下:
Java Regex中matches()和find()之间的区别
这个正则表达式是否也会匹配空字符串
""
?*
第三题
\\d*
的正则表达式可以匹配空字符串,但\\d+
不能。星号*
表示零个或多个,而加号+
表示一个或多个。请参见第一个负测试用例。
编译正则表达式模式不是更快吗?
是的。 编译正则表达式模式一次比在每次调用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());
您还可以使用Apache Commons中的NumberUtil.isNumber(String str)方法。
0xAF
,2.3e-4
和123L
。 - vikingsteveorg.apache.commons.lang.math.NumberUtils
而不是已经被弃用的org.apache.commons.lang.NumberUtils
。 - Lucky使用正则表达式在性能方面代价高昂。尝试将字符串解析为长整型值是低效且不可靠的,可能并不是您所需要的。
我建议的方法是简单地检查每个字符是否为数字,这可以使用Java 8的lambda表达式高效实现:
boolean isNumeric = someString.chars().allMatch(x -> Character.isDigit(x));
Character.isDigit(x)
可以进一步简化为Character::isDigit
。 - mre还有一种解决办法,尚未发布:
String regex = "\\p{Digit}+"; // uses POSIX character class
您需要允许多于一个数字(加号+
)的情况,例如:
String regex = "[0-9]+";
String data = "23343453";
System.out.println(data.matches(regex));
Long.parseLong(data)
并且捕获异常,处理减号。虽然所能容纳的数字位数有限,但这实际上创建了一个可用的数据变量,我想这是最常见的用法。
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()
}
Pattern.compile("[0-9]+.[0-9]+")
或Pattern.compile("\\d+.\\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
请参考org.apache.commons.lang3.StringUtils。
public static boolean isNumeric(CharSequence cs) {
if (cs == null || cs.length() == 0) {
return false;
} else {
int sz = cs.length();
for(int i = 0; i < sz; ++i) {
if (!Character.isDigit(cs.charAt(i))) {
return false;
}
}
return true;
}
}
String
类中,有一个叫做 matches()
的方法。通过使用这个方法,你可以验证正则表达式是否与你的字符串匹配。String regex = "^[\\d]{4}$";
String value = "1234";
System.out.println(data.matches(value));
上面正则表达式的解释是:
^
- 表示正则表达式的开始。
[]
- 在此内部,您必须描述自己的条件。
\\\d
- 仅允许数字。您可以在括号内使用'\\d'或0-9,它们都是相同的。
{4}
- 此条件允许恰好4个数字。您可以根据需要更改数字。
$
- 表示正则表达式的结尾。
注意: 您可以删除
{4}
并指定+
,表示一次或多次,或*
表示零次或多次,或?
表示一次或没有。
有关更多参考,请查看此网站:https://www.rexegg.com/regex-quickstart.html
public static boolean isNumeric(String str) { if (str == null || str.length() == 0) { return false; } return str.matches("^[0-9]+$"); }
其中,^
和$
分别表示匹配字符串的起始位置和结束位置,[0-9]
表示匹配数字,+
表示匹配前面的字符一次或多次。如果字符串符合该正则表达式,则返回true
,否则返回false
。注意,该方法仅适用于 ASCII 编码的数字。如果要支持 Unicode 编码的数字,需要使用其他方式实现。 - BobTheBuilder