我正在使用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,但我发现的东西让我对自己所做的事情更有信心。
我做错了什么不按预期工作?我是否滥用这种模式?
答案 0 :(得分:3)
如果在正则表达式中包含该字符的表达式,它将成为匹配内容的一部分。
诀窍是在替换字符串中使用您匹配的内容,因此您可以单独替换该位。
尝试:
replaceAll("([^'\[])test", "$1window.test"));
替换字符串中的$ 1是对捕获组1匹配的后向引用。在这种情况下,这是测试前的字符
答案 1 :(得分:0)
为什么不在"(test)(\s*)=(\s*)([\w\d]+)"
上进行测试?这样,您只匹配"test"
,然后是空格,后跟一个'='
符号后跟一个值(在这种情况下由数字和字母组成的字母和下划线字符组成)。然后,您可以使用组(括号之间)将值 - 甚至是空格(如果需要)复制到新文本中。