繁体   English   中英

数字旁边的正则表达式替换

[英]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 个捕获组。

当您在替换中遇到$时,您可能会:

  1. 如果前一个字符是\ ,则将其视为真正的$而不是引入捕获组引用,
  2. 如果下一个字符是数字,则按照您当前的操作并将其视为单个数字 integer 索引 CG 参考,
  3. 如果下一个字符是{ ,则找到匹配的}并解析它们之间的 integer 并再次使用它来索引正则表达式中的捕获组。

这样用户可以写$9${9}也可以写 $ ${10}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM