javascript - 为什么我的正则表达式在 JavaScript 中不起作用? (它适用于 Java)

标签 javascript java regex

<分区>

正则表达式为“(\d+)|(N\A)”,匹配数字或字符串“N\A”。它适用于 Java,但不适用于 JavaScript。

  1. Java 和 JavaScript 的结果不同。
  2. 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

感谢您的帮助。我的代码有问题:

  1. 当使用 RegExp() 创建正则表达式时,反斜杠应该被转义。 (@LukStorms、@grzegorz-oledzki 和@benny) (也引用来自 https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/RegExp 的演示)
  2. 测试方法不同于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+$/

最佳答案

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()

的行为

关于javascript - 为什么我的正则表达式在 JavaScript 中不起作用? (它适用于 Java),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49292762/

相关文章:

java - 动态创建和配置具有依赖关系的 OSGi 服务

regex - 如何 grep/sed/awk 获取以空白字符开头的一系列输出

Java通过\\S分割

javascript - 如何通过RegisterStartupScript传递2个参数?

javascript - 在哪种情况下,父节点不包括 CSS 中子节点的高度?

javascript - endingItem.callback 不是一个函数吗?

java - 需要帮助设计 "infinite"线程

Java查询mongodb查找列表大小小于n的文档

python - $gme 或 gme 的正则表达式在 python 中前后有空格或没有空格

javascript - 给 document.createElement 分配一个类 ('img' )