繁体   English   中英

Java RegExp:捕获字符后的部分,但不要替换字符

[英]Java RegExp: Capture part after a character but don't replace the character

我正在使用Java来解析JavaScript文件。 由于作用域与我在其中使用的环境不同,因此我尝试替换ie的每个实例

test = value

window.test = value

以前,我一直在使用

writer.append(js.getSource().replaceAll("test", "window.test"));

这显然不能推广,但对于固定数据集而言,它可以正常工作。

但是,在我应该使用的新文件中,旧文件的更新版本中,我现在必须处理

window['test'] = value

([[test]])

在这两种情况下,我都不想匹配test ,并且似乎只有这两种情况存在新格式。 所以我的计划是现在做一个正则表达式以匹配'[作为第一个字符。 那将是([^'\\[])test ; 但是,我实际上并不想替换第一个字符-请确保它不是我不想匹配的两个字符之一。

这对我来说是一个新情况,因为我没有花太多时间来用RegExps进行替换,而只是进行模式匹配。 因此,我环顾四周,发现我认为是解决方案的方法,称为“非捕获组”。 Oracle页面上的解释听起来像我在寻找什么,但是当我将正则表达式重新编写为(?:[^'\\\\[])test ,它的行为与我没有做过的行为完全相同改变了一切-替换test前的字符。 我环顾了StackOverflow,但发现的内容使我更加确信自己所做的应该可行。

我无法按预期工作,这是什么意思? 我在滥用图案吗?

如果您在正则表达式中包含该字符的表达式,则它将成为匹配项的一部分。

诀窍是使用您在替换字符串中匹配的内容,以便您自己替换该位。

尝试:

replaceAll("([^'\[])test", "$1window.test"));

替换字符串中的$ 1是对匹配的捕获组1的反向引用。 在这种情况下,这是测试前的字符

为什么不简单地对"(test)(\\s*)=(\\s*)([\\w\\d]+)" 这样,您只匹配"test" ,然后是空格,后跟一个'='符号,后跟一个值(在这种情况下,由数字,字母和下划线组成)。 然后,您可以使用组(在括号之间)将值-甚至将空格(如果需要)复制到新文本中。

暂无
暂无

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

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