[英]Regular expression replacement next to number
对不起,如果这已经回答了。 我试图寻找它,但也许我无法弄清楚如何正确地表达我的问题。
使用简单的正则表达式替换处理器制作一个小的 HTML 应用程序。 用户可以输入:文本、正则表达式模式、替换模式。 如果使用超过 9 个组并且用户想在组旁边放置一个数字,则会遇到障碍。
例子:
ABCDEFGHIJ...
(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)
(10组)$10
这将返回J
,但如果用户想要返回A0
怎么办? 我们如何用$1 0
替换,中间没有空格?
因此,我的代码的要点是:
let input = document.querySelector('#input').value
let regex = eval(document.querySelector('#pattern').value)
let replacement = document.querySelector('#replacement').value
document.querySelector('#output').value = input.replace(regex, replacement)
我正在做更多的错误检查和处理,但你明白了。
情况听起来有些模棱两可。 如果用户输入$10
并使用具有这么多组的模式,我认为用户可能想要使用第 10 个捕获组。 如果他们不这样做,那么用户一开始就不应该有 10 个捕获组。
但是如果你真的想防止$
后面的两位数进入两位数捕获组,那就有点hacky了,但是你可以添加另一个匹配空字符串的捕获组,然后替换用户的模式以删除连续的$\d\d
s,并在其间插入空字符串匹配器。
例如, $10
可以转换为$1$<nomatch>0
。
我看不到规范中允许 escaping 在$
之后出现或中断连续数字的任何干净内容,或者在不调整输入模式的情况下保证用空字符串进行一般替换。
也不需要eval
。
const value = '$10'; const patternValue = '(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)'; const pattern = new RegExp(patternValue + '|(?<nomatch>)'); const replacement = // document.querySelector('#pattern').value.replace( value.replace( /\$\d(?=\d)/g, '$&$<nomatch>' ); console.log(pattern); console.log(replacement); console.log('ABCDEFGHIJ'.replace(pattern, replacement));
但就像我最初所说的那样,这是一件很奇怪的事情。 使用具有 10 个捕获组的模式的 10 $10
的用户实际上可能想要实际使用第 10 个捕获组。
当您在替换中遇到$
时,您可能会:
\
,则将其视为真正的$
而不是引入捕获组引用,{
,则找到匹配的}
并解析它们之间的 integer 并再次使用它来索引正则表达式中的捕获组。 这样用户可以写$9
或${9}
也可以写 $ ${10}
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.