<分区>
考虑:
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 中,正则表达式对象具有状态。当 g
时,这很重要flag ("global") 应用于它们,有时以奇怪的方式应用。此状态是最后一次匹配发生的索引,即正则表达式的 .lastIndex
属性(property)。当您调用 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>
旁注:一般来说,最好使用正则表达式而不是使用 RegExp
在 JavaScript 中编写正则表达式。构造函数和字符串。在你的情况下,那将是
var reg = /^19[-\d]*/g;
// or without the g flag:
var reg = /^19[-\d]*/;
旁注 2:用 ^
定义正则表达式没有多大意义或 $
锚定和 g
标记,除非您还使用 m
(多行)标志以更改这些 anchor 的含义。没有m
, 它们表示“输入的开始 ( ^
) 或结束 ( $
)”。 与 m
标志,它们的意思是“行的开始(^
)或结束($
)。”
关于javascript - 为什么 'g' 标志会改变 JavaScript 正则表达式的结果?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32421632/
相关文章:
javascript - 如何使用PDF.JS显示整个PDF(不仅仅是一页)?
javascript - 使用 javascript/jquery 检测是否具有给定类的任何元素
javascript - XMLHttpRequest 未定义,在 chrome 扩展选项页面中
java - 正则表达式匹配给定序列的空白、任何字符和/或换行符
javascript - 到达另一个 div 时停止 div 滚动
php - 使用正则表达式搜索并替换数据库中存在的电子邮件 ID
regex - Force -Match 运算符使表达式失败