【发布时间】:2015-09-06 08:39:17
【问题描述】:
考虑:
var reg = new RegExp("^19[-\\d]*","g");
reg.test('1973-02-01') // true
reg.test('1973-01-01') // false
为什么第三行返回false?如果我删除“g”标志,那么它会返回true。
【问题讨论】:
标签: javascript regex
考虑:
var reg = new RegExp("^19[-\\d]*","g");
reg.test('1973-02-01') // true
reg.test('1973-01-01') // false
为什么第三行返回false?如果我删除“g”标志,那么它会返回true。
【问题讨论】:
标签: javascript regex
在 JavaScript 中,正则表达式对象具有状态。当g 标志(“全局”)应用于它们时,这很重要,有时以奇怪的方式应用。此状态是匹配最后发生的索引,即正则表达式的.lastIndex 属性。当您再次在同一个正则表达式对象上调用 exec 或 test 时,它会从中断处继续。
在您的示例中发生的情况是第二次调用,它从上次中断的地方开始,因此它从字符串中的第 10 个字符开始查找 - 并且在那里找不到匹配项,因为没有根本没有文本(即使有,^ 断言也不匹配)。
如果我们查看lastIndex 属性,我们可以看到发生了什么:
var reg = new RegExp("^19[-\\d]*","g");
snippet.log("Before first test: " + reg.lastIndex);
snippet.log(reg.test('1973-02-01')); //return true
snippet.log("Before second test: " + reg.lastIndex);
snippet.log(reg.test('1973-01-01')); //return false
snippet.log("After second test: " + reg.lastIndex);
<!-- Script provides the `snippet` object, see http://meta.stackexchange.com/a/242144/134069 -->
<script src="http://tjcrowder.github.io/simple-snippets-console/snippet.js"></script>
没有g标志,正则表达式对象不保持任何状态,每次都从字符串的开头开始:
var reg = new RegExp("^19[-\\d]*");
snippet.log("Before first test: " + reg.lastIndex);
snippet.log(reg.test('1973-02-01')); //return true
snippet.log("Before second test: " + reg.lastIndex);
snippet.log(reg.test('1973-01-01')); //return false
snippet.log("After second test: " + reg.lastIndex);
<!-- Script provides the `snippet` object, see http://meta.stackexchange.com/a/242144/134069 -->
<script src="http://tjcrowder.github.io/simple-snippets-console/snippet.js"></script>
旁注:一般来说,最好在 JvaScript 中使用正则表达式而不是使用 RegExp 构造函数和字符串来编写正则表达式。在你的情况下,那将是
var reg = /^19[-\d]*/g;
// or without the g flag:
var reg = /^19[-\d]*/;
旁注 2:除非您还使用 @ 987654338@(多行)标志来更改这些锚的含义。没有m,它们的意思是“输入的开始(^)或结束($)”。 使用m 标志,它们的意思是“行的开始 (^) 或结束 ($)。”
【讨论】:
'1973-02-01'),将生成完全相同的输出
RegExp 对象,并在此处重用 reg 我希望与问题中的行为相同。
var reg = /^19[-\d]*/g;) 而不是 RegExp 构造函数不会解决此问题。 (jsfiddle.net/ejf08zb8) 我只是提到通常情况下,最好使用文字语法,除非您有充分的理由使用构造函数。