const name = 'preceding_text_0_following_text';
const matcher = /(\d+)/;
// Replace with whatever you would like
const newName = name.replace(matcher, 'NEW_STUFF');
console.log("Full replace", newName);
// Perform work on the match and replace using a function
// In this case increment it using an arrow function
const incrementedName = name.replace(matcher, (match) => ++match);
console.log("Increment", incrementedName);
7条答案
按热度按时间xytpbqjk1#
解决方案是为前面和后面的文本添加捕获:
说明
括号用于创建“组”,然后为组分配一个base-1索引,可以在替换
$
时访问。(\w+)
在一个组中,并且变成$1
(\d+)
是第二组(但在替换中被忽略)因此,当您给予替换字符串
"$1!new_ID!$3"
时,$1
和$3
会自动替换为第一组和第三组,从而允许第二组替换为新字符串,并保留其周围的文本。w80xi6nr2#
现在Javascript有了lookbehind(从ES2018开始),在新的环境中,你可以在类似的情况下完全避免使用组。相反,lookbehind查找在你捕获的组之前的内容,lookahead查找在你捕获的组之后的内容,并替换为 just
!NEW_ID!
:使用此方法,完全匹配 * 仅 * 需要替换的部分。
(?<=name="\w+)
-name="
的Lookbehind,后跟单词字符(幸运的是,在Javascript中lookbehind不必是固定宽度!)\d+
-匹配一个或多个数字-模式中唯一不在lookaround中的部分,字符串中唯一将在结果匹配中的部分(?=\w+")
-先行查找后跟"
'的字字符请记住,lookbehind是一个相当新的工具。它可以在现代版本的V8(包括Chrome、Opera和Node)中使用,但不能在大多数其他环境中使用,至少现在还不能。因此,尽管你可以在Node和你自己的浏览器(如果它运行在现代版本的V8上)中可靠地使用lookbehind,但它还不能得到随机客户端(比如公共网站)的充分支持。
ndasle7k3#
对Matthew的答案的一点改进可以是前瞻性的,而不是最后一个捕获组:
或者,您也可以在小数点处拆分,然后加入新的id,如下所示:
示例/性能指标评测:https://codepen.io/jogai/full/oyNXBX
au9on6nz4#
用两个捕获组也是可能的;我还会在数字前后加上两个破折号,作为附加的左边界和右边界,修改后的表达式将如下所示:
如果你想探索/简化/修改这个表达式,在regex101.com的右上角面板上已经解释过了。如果你愿意,你也可以在this link中观察它如何与一些示例输入进行匹配。
RegEx电路
jex.im 将正则表达式可视化:
1tuwyuhd5#
一个更简单的选择是只捕获数字并替换它们。
资源
fhity93d6#
结果为
一些文本!新ID!一些文本
JS正则表达式中的
x(?=y)
仅当“x”后跟“y”时才匹配“x”。例如,
/Jack(?=Sprat)/
仅当“Jack”后跟“Sprat”时才匹配“Jack”。/Jack(?=Sprat|Frost)/
仅当“Jack”后跟“Sprat”或“Frost”时才匹配“Jack”。但是,匹配结果中既没有“Sprat”也没有“Frost”。详细信息
oalqel3c7#
了解如果需要转换和操作捕获组,可以使用转换器函数作为第二个参数...
API
第一个
捕获的数量与你在正则表达式中使用的数量有关。
index
和input_str
是最后一个。请参阅下面的示例及其输出以更好地了解每种方法。
文件参考:
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/replace#making_a_generic_replacer
示例:
上面的核心示例是将命令行参数转换为javascript camel大小写等效形式。
转变:
至