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

时间:2018-03-15 06:22:07

标签: javascript java regex

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

  1. Java和JavaScript之间的结果不同。
  2. JavaScript中两个版本的结果不同。
  3. 我犯了什么错?

    代码摘要:

    爪哇

    环境: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. 的演示
    3. 测试方法与Java中的匹配方法不同。它应该添加^$来断言字符串的开头和结尾。 (@sweeper答案中的更多细节)
    4. 所以,代码可以是:

      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+$/
      

2 个答案:

答案 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+");