Java RegEx:在角色之后捕获部分但不替换角色

时间:2012-12-10 19:51:42

标签: java regex

我正在使用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,但我发现的东西让我对自己所做的事情更有信心。

我做错了什么不按预期工作?我是否滥用这种模式?

2 个答案:

答案 0 :(得分:3)

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

诀窍是在替换字符串中使用您匹配的内容,因此您可以单独替换该位。

尝试:

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

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

答案 1 :(得分:0)

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