【发布时间】:2019-08-14 06:08:13
【问题描述】:
根据this question接受的答案,以下是从字符串中删除某个字符的最后一个实例的语法(在这种情况下,我想删除最后一个&):
function remove (string) {
string = string.replace(/&([^&]*)$/, '$1');
return string;
}
console.log(remove("height=74&width=12&"));
但我正试图完全理解 为什么它有效。
根据 regex101.com,
/&([^&]*)$/
&匹配字符 & 字面意思(区分大小写)第一抓捕组
([^&]*)匹配下面列表中不存在的单个字符[^&]*
*量词 - 匹配零次和无限次,尽可能多次,按需回馈(贪婪)
&匹配字符 & 字面意思(区分大小写)
$在字符串末尾断言位置,或在字符串末尾的行终止符之前(如果有)
因此,如果我们将字符 & 与第一个 & 匹配:
那为什么我们还要“匹配以下列表中不的单个字符”?
似乎适得其反。
然后,“$ 在字符串末尾断言位置”——这是什么意思?它首先从字符串的后面开始搜索匹配项?
最后,$1 在 replaceValue 中做了什么?为什么是$1 而不是空字符串? ""
【问题讨论】:
-
在人类语言中,你的模式说要匹配
&,然后匹配并捕获&之后的内容,直到模式结束。模式的编写方式,&必须是输入中的最后一个。然后,它只用捕获组替换所有内容,有效地删除最后一个&。 -
所以,对于我的特定字符串 -
"height=74&width=12&"- 它匹配第一个&,然后匹配并捕获所有这些:width=12&?然后它从该捕获组中删除&,因为&最初是在捕获组之外声明的? -
不,对于您上面评论中的示例输入,只有最后的
&将被删除,see the demo。 -
因为
([^&]*)捕获所有字符除了&? 为什么只删除了最后的&?
标签: javascript regex string replace