【问题标题】:Remove Last Instance Of Character From String - Javascript - Revisited从字符串中删除字符的最后一个实例 - Javascript - 重新访问
【发布时间】: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


【解决方案1】:

1- 我认为该问题的解决方案与您想要的解决方案不同:

该正则表达式将替换最后一个“&”,无论它在哪里,在字符串的中间或末尾。

如果您将此正则表达式应用于这两个示例,您将看到第一个被“错误地”替换:

height=74&width=12&test=1
height=74&width=12&test=1&

它们被替换为:

height=74&width=12test=1
height=74&width=12&test=1

所以要真正替换最后一个“&”,你唯一需要做的就是:

string.replace(/&$/, '');

现在,如果你想替换最后出现的“&”,不管它在哪里,我会解释那个正则表达式:

$1 代表一个(捕获组),那些 ([^&]*) 里面的所有东西都被捕获在那个 $1 里面。这是过于简单化了。

&([^&]*)$

& 将匹配文字“&”,然后在以下捕获组中,此正则表达式将查找任意数量(0 到无限)的字符(不等于“&”,稍后解释),直到字符串或行的末尾(取决于您在正则表达式中使用的标志,/m 用于匹配行)。当您应用替换时,此捕获组中捕获的任何内容都将变为 1 美元。

所以,如果你在脑海中应用这个逻辑,你会发现它总是匹配最后一个 & 并将其替换为右侧不包含单个“&””的任何内容

&(<nothing-like-a-&>*)<until-we-reach-the-end> replaced by anything found inside (<nothing-like-a-&>*) == $1. In this case because of the use of * , it means 0 or more times, sometimes the capturing group $1 will be empty.


不等于部分: 正则表达式使用了[^],简单来说[]表示一组独立的字符,例如:[ab]或[ba]表示相同,它会一直寻找“a”或“b”。在这里面你也可以像这样 [0-9ba] 寻找 0 到 9 的范围,它总是匹配从 0 到 9、a 或 b 的任何值。

这里的“^” [^] 表示对内容的否定,因此,它将匹配任何不在该组中的内容,例如 [^0-9] 将始终匹配任何不是数字的内容。在您的正则表达式 [^&] 中,它用于查找不是“&”的任何内容

【讨论】:

  • 感谢您的解释!所以本质上,做string.replace(/&$/, "")就像说,用空字符串替换字符串的最后一个字符只有当最后一个字符是&
  • 是的,$ 代表一个位置,在正则表达式中它是字符串或行的结尾,然后你输入 &$ 它会在它旁边寻找字符串结尾的“&” .您也可以使用 ^ 表示字符串或行的开头。因此,^& 将替换字符串开头的 &。
  • 我会在答案中添加更多内容,我发现我没有很好地解释 [^&]* 部分。
猜你喜欢
  • 1970-01-01
  • 2011-08-01
  • 2017-08-19
  • 1970-01-01
  • 1970-01-01
  • 2011-01-19
相关资源
最近更新 更多