正则表达式为“(\d+)|(N\A)
”,它匹配数字或字符串“N \ A”。它适用于Java,但不适用于JavaScript。
我犯了什么错?
代码摘要:
爪哇
环境:JDK 1.8.0_144
String orderNumberRegExp = "(\\d+)|(N/A)";
System.out.println("12345".matches(orderNumberRegExp));
String digitalOnly = "\\d+";
System.out.println("12345".matches(digitalOnly));
System.out.println("12345ABC".matches(digitalOnly));
输出(如我所料):
true
true
false
的JavaScript
环境:node v9.8.0
这两个版本都会返回错误的结果。
版本1:
var orderNumberRegExp = new RegExp("(\d+)|(N\/A)"); // or "(\d+)|(N/A)"
console.log(orderNumberRegExp.test("12345"));
var digitalOnly = new RegExp("\d+");
console.log(digitalOnly.test("12345"));
console.log(digitalOnly.test("12345ABC"));
输出:
false
false
false
第2版:
var orderNumberRegExp = /(\d+)|(N\/A)/
console.log(orderNumberRegExp.test("12345"));
var digitalOnly = /\d+/;
console.log(digitalOnly.test("12345"));
console.log(digitalOnly.test("12345ABC"));
输出:
true
true
true
感谢您的帮助。我的代码有问题:
RegExp()
创建正则表达式,应该对反斜杠进行转义。 (@LukStorms,@ grzegorz-oledzki和@benny)
(也参考https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/RegExp)^
和$
来断言字符串的开头和结尾。 (@sweeper答案中的更多细节)所以,代码可以是:
var orderNumberRegExp = new RegExp("^(\\d+)$|^(N/A)$");
console.log(orderNumberRegExp.test("12345")); // true
console.log(orderNumberRegExp.test("N/A")); // true
console.log(orderNumberRegExp.test("12345ABC")); // false
console.log(orderNumberRegExp.test("ABC1234")); // false
var digitalOnly = new RegExp("^\\d+$");
console.log(digitalOnly.test("12345")); // true
console.log(digitalOnly.test("12345ABC")); // false
正则表达式也可以是:
var orderNumberRegExp = /^(\d+)$|^(N\/A)$/
var digitalOnly = /^\d+$/
答案 0 :(得分:5)
test
方法与Java中的matches
方法不同。
RegEx.prototype.test()
就会返回true,而Matcher.matches()
仅在整个字符串与模式匹配时才返回true。因此,JavaScript test()
更类似于Java Matcher.find()
,而不是Matcher.matches()
。
要使您的Javascript正则表达式正常工作,您需要添加^
和$
来断言字符串的开头和结尾:
var orderNumberRegExp = /^(?:(\d+)|(N\/A))$/
console.log(orderNumberRegExp.test("12345"));
var digitalOnly = /^\d+$/;
console.log(digitalOnly.test("12345"));
console.log(digitalOnly.test("12345ABC"));
这将模拟Matcher.matches()
答案 1 :(得分:2)
尝试var digitalOnly = new RegExp("\\d+");