javascript - 为什么 'g' 标志会改变 JavaScript 正则表达式的结果?

标签 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)。当您调用 exectest再次在同一个正则表达式对象上,它从停止的地方开始。

您的示例中发生的是第二次调用,它从上次停止的地方开始,因此它从字符串中的第 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 滚动

java - 从文本中提取特定单词

php - 使用正则表达式搜索并替换数据库中存在的电子邮件 ID

regex - Force -Match 运算符使表达式失败

javascript - jQuery:搜索包含特定标记的 div

javascript - 在 Node.js 中使用异步模块的问题