【问题标题】:Issue with custom javascript regex自定义 javascript 正则表达式的问题
【发布时间】:2012-09-24 17:01:28
【问题描述】:

我有一个自定义正则表达式,用于检测整数、分数和浮点数。

var regEx = new RegExp("^((^[1-9]|(0\.)|(\.))([0-9]+)?((\s|\.)[0-9]+(/[0-9])?)?)$");
var quantity = 'd';
var matched = quantity.match(regEx);
alert(matched);

​ (代码也可以在这里找到:http://jsfiddle.net/aNb3L/。)

问题是它匹配单个字母,我不知道为什么。但是对于更多的字母它会失败(这很好)。

免责声明:我是正则表达式的新手,尽管在 http://gskinner.com/RegExr/ 中它不匹配单个字母

【问题讨论】:

  • 我不明白/[0-9] 的最后部分是什么。我猜这是您想要自己的识别器的部分原因。
  • 您需要转义字符串文字中的\ 字符。如果要在正则表达式中使用\ 字符,则需要在字符串文字中将其写为'\\'。这意味着将\ 字符与您需要使用'\\\\' 的正则表达式匹配。
  • 你是否需要用指数符号来处理浮点数,例如1.23e12?

标签: javascript regex


【解决方案1】:

使用直接的正则表达式语法更容易:

var regEx = /^((^[1-9]|(0\.)|(\.))([0-9]+)?((\s|\.)[0-9]+(\/[0-9])?)?)$/;

当您使用RegExp 构造函数时,您必须在反斜杠上加倍。实际上,您的代码只有一个反斜杠,因此 \. 子表达式被视为 . — 这就是单个非数字字符如何通过。

因此你的也可以这样工作:

var regEx = new RegExp("^((^[1-9]|(0\\.)|(\\.))([0-9]+)?((\\s|\\.)[0-9]+(/[0-9])?)?)$");

这是因为字符串语法 also 使用反斜杠作为引用机制。当你的正则表达式第一次被解析为字符串常量时,如果你不加倍,那些反斜杠会被去掉。当字符串被传递给正则表达式解析器时,它们就消失了。

您真正需要使用RegExp 构造函数的唯一时候是当您动态构建正则表达式时,或者当它通过 JSON 或其他方式传递到您的代码时。

【讨论】:

  • 我还建议使用 regEx.test(quantity) 而不是 match 进行验证。
【解决方案2】:

好吧,对于一个整数,这将是您的正则表达式:

/^(0|[1-9]\d*)$/

那么你必须考虑浮动的可能性:

/^(0|[1-9]\d*)(.\d+)?$/

那么你必须考虑分数的可能性:

/^(0|[1-9]\d*)((.\d+)|(\/[1-9]\d*)?$/

对我来说,这个正则表达式比你原来的更容易阅读,但这当然取决于你。

【讨论】:

  • 正如我所说,我是正则表达式的新手。不过谢谢你,我会研究它,如果它工作正常我会使用它。
  • 只是觉得如果你想要我会提供一个替代方案!
猜你喜欢
  • 1970-01-01
  • 2011-02-05
  • 1970-01-01
  • 1970-01-01
  • 2019-05-09
  • 2011-04-03
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多