为啥匹配的子字符串在 JavaScript 中返回“未定义”?

Posted

技术标签:

【中文标题】为啥匹配的子字符串在 JavaScript 中返回“未定义”?【英文标题】:Why is a matched substring returning "undefined" in JavaScript?为什么匹配的子字符串在 JavaScript 中返回“未定义”? 【发布时间】:2010-09-30 18:37:00 【问题描述】:

我今天在 javascript 中执行一些正则表达式时遇到了一个奇怪的行为(Windows Vista 上的 Firefox 3)。

var str = "format_%A";
var format = /(?:^|\s)format_(.*?)(?:\s|$)/.exec(str);

console.log(format);    // ["format_%A", "%A"]
console.log(format[0]); // "format_undefined"
console.log(format[1]); // Undefined

正则表达式没有错。如您所见,它与第一个 console.log 调用中的正确部分匹配。

Internet Explorer 7 和 Chrome 都按预期运行:format[1] 返回“%A”(嗯,Internet Explorer 7 做对了有点出乎意料...)

这是 Firefox 中的错误,还是我不知道的某些“功能”?

【问题讨论】:

我从未见过您在这里使用的文字匹配语法。你能指出一些可以阅读的网络资源吗? 我认为至少应该提供上一个几乎相同问题的链接:***.com/questions/432493/… @PEZ:你在说什么文字匹配语法? @PEZ: developer.mozilla.org/en-US/docs/JavaScript/Guide/… 这不是 firefox 问题,而是 firebug 问题。 【参考方案1】:

这是因为 console.log() 的工作方式类似于 printf()。 console.log() 的第一个参数实际上是一个格式字符串,后面可以跟其他参数。 %A 是占位符。例如:

console.log("My name is %A", "John"); // My name is "John"

详情请参阅console.log() documentation。 %A 和任何其他未记录的占位符似乎与 %o 一样。

【讨论】:

明确地说,这不是 console.log 在 Safari 的 Web Inspector 中的行为方式。 Firefox 的行为并非如此——这显然是一个萤火虫特有的功能。这不是萤火虫功能吗?【参考方案2】:

似乎%A 以某种方式转换为字符串undefined

尝试转义 %A 部分,我认为这会解决问题。

【讨论】:

好收获。它被视为 URL 转义(如 %20 等),但 %A 不是其中之一,因此未定义。 似乎是 Firebug 的问题

以上是关于为啥匹配的子字符串在 JavaScript 中返回“未定义”?的主要内容,如果未能解决你的问题,请参考以下文章

JavaScript 正则表达式

JavaScript 字符串替换中的子匹配组引用是不是有分隔符/消歧语法?

匹配两个特殊字符之间的子字符串,不包括字符

JavaScript重点记忆

JavaScript中字符串的match与replace方法

JavaScript 正则表达式