<分区>
正则表达式为“(\d+)|(N\A)
”,匹配数字或字符串“N\A”。它适用于 Java,但不适用于 JavaScript。
- Java 和 JavaScript 的结果不同。
- JavaScript 中两个版本的结果不同。
我做错了什么?
代码代码片段:
Java
环境: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 的演示) - 测试方法不同于Java中的matches方法。它应该添加
^
和$
来断言字符串的开始和结束。 (@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+$/