我有HTML代码之前和之后的字符串:
name="some_text_0_some_text"
我想用像这样的东西替换0:!NEW_ID!
所以我做了一个简单的正则表达式:
.*name="\w+(\d+)\w+".*
但是我不知道如何专门替换捕获的块。
是否有一种方法替换捕获的结果,如($1)与其他字符串?
结果将是:
name="some_text_!NEW_ID!_some_text"
我有HTML代码之前和之后的字符串:
name="some_text_0_some_text"
我想用像这样的东西替换0:!NEW_ID!
所以我做了一个简单的正则表达式:
.*name="\w+(\d+)\w+".*
但是我不知道如何专门替换捕获的块。
是否有一种方法替换捕获的结果,如($1)与其他字符串?
结果将是:
name="some_text_!NEW_ID!_some_text"
当前回答
"some_text_0_some_text".replace(/(?=\w+)\d+(?=\w+)/, '!NEW_ID!')
结果是
some_text_ NEW_ID !_some_text
(?=\w+)\d+(?=\w+)/; const NEW_ID = '! Const STR = 'some_text_0_some_text'; const result = str.replace(regExp, newID); console.log(结果);
JS RegExp中的x(?=y)
仅当x后面有y时匹配x。例如,/Jack(?=Sprat)/只匹配“Jack”后面跟“Sprat”。 /Jack(?=Sprat|Frost)/只有后面跟“Sprat”或“Frost”时才能匹配“Jack”。然而,“Sprat”和“Frost”都不是比赛结果的一部分。
细节
其他回答
现在Javascript有了后视功能(ES2018),在更新的环境中,你可以在这种情况下完全避免分组。相反,你应该向后看你要捕捉的群体之前发生了什么,然后向前看之后发生了什么,然后用!NEW_ID!:
Const STR = 'name="some_text_0_some_text"'; console.log ( str.replace (/ (? < = name = " \ w +) \ d + (? = \ w +”)/“NEW_ID !”) );
使用这种方法,完全匹配的只是需要更换的部分。
(?<=name="\w+) -查找name=",后面跟着单词字符(幸运的是,在Javascript中查找的宽度不必是固定的!) \d+ -匹配一个或多个数字-模式中唯一不在查找中的部分,字符串中唯一将在结果匹配中出现的部分 (?=\w+") -查找后跟"的单词字符 `
请记住,向后看是相当新的。它可以在V8的现代版本(包括Chrome、Opera和Node)中运行,但在大多数其他环境中还不行,至少目前还不行。因此,虽然你可以在Node和你自己的浏览器中可靠地使用向后查找(如果它运行在V8的现代版本上),但它还没有被随机客户端(比如公共网站)充分支持。
一个更简单的选择是只捕获数字并替换它们。
Const name = ' beforeing_text_0_following_text '; Const matcher = /(\d+)/; //替换成你想要的任何东西 const newName = name。替换(匹配器,NEW_STUFF); console.log("完全替换",newName); //使用函数对匹配和替换进行操作 //在这种情况下,使用箭头函数增加它 const incrementedName = name。替换(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 NEW_ID = '! Const STR = 'some_text_0_some_text'; const result = str.replace(regExp, newID); console.log(结果);
JS RegExp中的x(?=y)
仅当x后面有y时匹配x。例如,/Jack(?=Sprat)/只匹配“Jack”后面跟“Sprat”。 /Jack(?=Sprat|Frost)/只有后面跟“Sprat”或“Frost”时才能匹配“Jack”。然而,“Sprat”和“Frost”都不是比赛结果的一部分。
细节
对马太的答案稍加改进,可以是一个前瞻,而不是最后一个捕捉组:
.replace(/(\w+)(\d+)(?=\w+)/, "$1!NEW_ID!");
或者你可以在小数点上拆分,并像这样与你的新id连接:
.split(/\d+/).join("!NEW_ID!");
示例/基准在这里:https://codepen.io/jogai/full/oyNXBX
一个解决方案是为前面和下面的文本添加捕获:
str.replace(/(.*name="\w+)(\d+)(\w+".*)/, "$1!NEW_ID!$3")
解释
括号用于创建“组”,然后分配一个以1为基数的索引,可以用$进行替换。
第一个单词(\w+)在一个组中,变成$1 中间部分(\d+)是第二组(但在replace中被忽略) 第三组(\w+".*)变成$3
所以当你给替换字符串"$1!new_ID! "$3"时,$1和$3会自动被第一组和第三组替换,允许第二组被新字符串替换,并保留它周围的文本。