The regular expression is "(\d+)|(N\A)
", which matches digits or string "N\A". It works in Java, but not in JavaScript.
- Results are different between Java and JavaScript.
- Results of two versions in JavaScript are different.
What's wrong I made?
Code code snippet:
Java
Environment: 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));
Output (as my expected):
true
true
false
JavaScript
Environment: node v9.8.0
The two versions return wrong results both.
Version 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"));
Output:
false
false
false
Version 2:
var orderNumberRegExp = /(\d+)|(N\/A)/
console.log(orderNumberRegExp.test("12345"));
var digitalOnly = /\d+/;
console.log(digitalOnly.test("12345"));
console.log(digitalOnly.test("12345ABC"));
Output:
true
true
true
Thanks for all your help. My code has issues:
- When to create regular expression using
RegExp()
, the backslash should be escaped. (@LukStorms, @grzegorz-oledzki, and @benny) (Also Ref to the demo from https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/RegExp) - The test method is different from the matches method in Java. It should add
^
and$
to assert the start and end of the string. (More details in the answer by @sweeper )
So, code can be:
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
The regular expressions can also be:
var orderNumberRegExp = /^(\d+)$|^(N\/A)$/
var digitalOnly = /^\d+$/