为什么正则表达式与此字符串不匹配

时间:2018-03-28 07:58:11

标签: javascript regex

我正在编写以下正则表达式来验证Excel工作表格式中的不同货币条目:

/^((\s*[\$]?[+-]?\d*|(\d{0,3}(\s?\d{3})*)(,\d+)?[\$]?(\s*[sSrR]\s*(\d+|(\d+-\d+)))?)|((\s*[\$]?[+-]?\d*|(\d{0,3}(\s?\d{3})*)(,\d+)?[\$]?(\t\s*[\$]?[+-]?\d*|(\d{0,3}(\s?\d{3})*)(,\d+)?[\$]?)*[\n\rx]*)+))$/

此正则表达式是通过以下javascript代码生成的:

var groupingSeparator = "\\s";  // For euro currency
var decimalSeparator = ",";  // for euro currency
var NUMBER = "\\s*[\\$]?[+-]?\\d*|(\\d{0,3}(" + groupingSeparator + "?\\d{3})*)(" + decimalSeparator + "\\d+)?[\\$]?";

this.basicNumberRegExp = NUMBER;
var REPEAT_NUMBER = NUMBER + "(\\s*[sSrR]\\s*(\\d+|(\\d+-\\d+)))?";

var EXCEL_LINE = NUMBER + "(\\t" + NUMBER + ")*";
var EXCEL_MULTI_LINE = "(" + EXCEL_LINE + "[\\n\\rx]*)+";
var ret = "^((" + REPEAT_NUMBER + ")|(" + EXCEL_MULTI_LINE + "))$";

它应验证以下条目:

3r3
-3r3
333
-333
333,33
-333,33
333 333
-333 33

但它没有匹配/验证以下值,原因是什么:

-3r3

1 个答案:

答案 0 :(得分:3)

你错过了一对括号。

您已定义

var NUMBER = "\\s*[\\$]?[+-]?\\d*|(\\d{0,3}(" + groupingSeparator + "?\\d{3})*)(" + decimalSeparator + "\\d+)?[\\$]?";

太长了,但基本上是

var NUMBER = "(...) | (...)";

声明

var REPEAT_NUMBER = NUMBER + "(\\s*[sSrR]\\s*(\\d+|(\\d+-\\d+)))?";

REPEAT_NUMBER定义为

"(...) | (...)(...)?"

被解析为(因为|的优先级低于连接)

"(...) | ((...)(...)?)"

添加一对括号将起作用。定义

var NUMBER = "(\\s*[\\$]?[+-]?\\d*|(\\d{0,3}(" + groupingSeparator + "?\\d{3})*)(" + decimalSeparator + "\\d+)?[\\$]?)";

Try it online!