我在字符串之前和之后都有 HTML 代码:
name="some_text_0_some_text"
我想将 0
替换为:!NEW_ID!
所以我做了一个简单的正则表达式:
.*name="\w+(\d+)\w+".*
但我看不到如何专门替换捕获的块。
有没有办法用其他字符串替换像 ($1) 这样的捕获结果?
结果将是:
name="some_text_!NEW_ID!_some_text"
一种解决方案是为前面和后面的文本添加捕获:
str.replace(/(.*name="\w+)(\d+)(\w+".*)/, "$1!NEW_ID!$3")
既然 Javascript 具有后向功能(自 ES2018 起),在较新的环境中,您可以在此类情况下完全避免使用组。相反,向后查看您正在捕获的组之前的内容,并向前查看之后的内容,并替换为 just !NEW_ID!
:
常量 str = 'name="some_text_0_some_text"'; console.log(str.replace(/(?<=name="\w+)\d+(?=\w+")/, '!NEW_ID!'));
使用这种方法,完全匹配的只是需要替换的部分。
(?<=name="\w+) - name="的后视,后跟单词字符(幸运的是,在 Javascript 中后视不必是固定宽度!)
\d+ - 匹配一个或多个数字 - 模式的唯一部分不在环视中,字符串的唯一部分将在结果匹配中
(?=\w+") - 预读单词字符,后跟 " `
请记住,lookbehind 是相当新的。它适用于现代版本的 V8(包括 Chrome、Opera 和 Node),但not in most other environments,至少目前还没有。因此,虽然您可以在 Node 和您自己的浏览器中可靠地使用lookbehind(如果它在现代版本的 V8 上运行),但随机客户端(例如在公共网站上)还没有充分支持它。
\d+
进行分组,对吗?
match => match * 2
替换第二个参数。数字仍然是整个匹配,因此不需要组
对马修的答案的一点改进可能是前瞻而不是最后一个捕获组:
.replace(/(\w+)(\d+)(?=\w+)/, "$1!NEW_ID!");
或者您可以按小数拆分并使用您的新 ID 加入,如下所示:
.split(/\d+/).join("!NEW_ID!");
此处的示例/基准:https://codepen.io/jogai/full/oyNXBX
也可以使用两个捕获组;我还包括两个破折号,作为附加的左右边界,在数字之前和之后,修改后的表达式看起来像:
(.*name=".+_)\d+(_[^"]+".*)
const 正则表达式 = /(.*name=".+_)\d+(_[^"]+".*)/g; const str = `some_data_before name="some_text_0_some_text" 然后 some_data after`; const subst = ` $1!NEW_ID!$2`; const 结果 = str.replace(regex, subst); console.log(result);
如果您想探索/简化/修改表达式,它已在 regex101.com 的右上角面板中进行了说明。如果您愿意,您还可以在此链接中观看它如何与一些示例输入匹配。
正则表达式电路
jex.im 可视化正则表达式:
https://i.stack.imgur.com/xYswa.png
一个更简单的选择是只捕获数字并替换它们。
常量名称 = 'preceding_text_0_following_text';常量匹配器 = /(\d+)/; // 替换为你想要的任何内容 const newName = name.replace(matcher, 'NEW_STUFF'); console.log("完全替换", newName); // 使用函数对匹配和替换执行工作 // 在这种情况下,使用箭头函数递增它 const incrementedName = name.replace(matcher, (match) => ++match); console.log("增量", incrementedName);
资源
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/replace
"some_text_0_some_text".replace(/(?=\w+)\d+(?=\w+)/, '!NEW_ID!')
结果是
some_text_!NEW_ID!_some_text
常量正则表达式 = /(?=\w+)\d+(?=\w+)/; const newID = '!NEW_ID!';常量 str = 'some_text_0_some_text';常量结果 = str.replace(regExp, newID);控制台.log(结果);
x(?=y)
在 JS 正则表达式中
仅当“x”后跟“y”时才匹配“x”。例如,/Jack(?=Sprat)/
仅在其后跟“Sprat”时才匹配“Jack”。 /Jack(?=Sprat|Frost)/
仅当其后跟“Sprat”或“Frost”时才匹配“Jack”。然而,“Sprat”和“Frost”都不是比赛结果的一部分。
$
替换,因此第一个单词(\w+)
在一个组中,变成$1
,中间部分(\d+)
是第二组,(但在替换中被忽略),第三组是$3
。因此,当您给出"$1!new_ID!$3"
的替换字符串时,$1 和 $3 会自动替换为第一组和第三组,允许第二组替换为新字符串,并保持其周围的文本。