【发布时间】:2012-11-28 06:57:15
【问题描述】:
我正在使用 Java 来解析 JavaScript 文件。因为范围与我使用它的环境中的预期不同,所以我试图替换 i.e. 的每个实例
test = value
与
window.test = value
以前,我只是在使用
writer.append(js.getSource().replaceAll("test", "window.test"));
这显然是不可推广的,但对于一个固定的数据集它工作正常。
但是,在我应该使用的新文件中,旧文件的更新版本,我现在必须处理
window['test'] = value
和
([[test]])
我不想在这两种情况下匹配test,而且似乎只有这两种情况有新格式。所以我的计划是现在做一个正则表达式来匹配除' 和[ 作为第一个字符之外的任何内容。那将是([^'\[])test;但是,我实际上并不想替换第一个字符 - 只要确保它不是我不想匹配的两个字符之一。
这对我来说是一个新情况,因为我没有用 RegExps 进行替换,只是模式匹配。所以我环顾四周,找到了我认为的解决方案,称为“非捕获组”。 Oracle 页面上的解释听起来像我正在寻找的东西,但是当我将正则表达式重写为 (?:[^'\\[])test 时,它的行为就像我没有更改任何东西一样 - 替换 @987654337 之前的字符@。我环顾 StackOverflow,但我发现的只是让我更加确信我正在做的事情应该有效。
我做错了什么,它没有按预期工作?我是否滥用了模式?
【问题讨论】:
-
你能发个SSCCE
-
regexplanet.com/advanced/java/index.html 以及正则表达式的示例、要匹配的表达式和结果都是示例。
-
这正是我正在查看的示例;然而,当我在
replaceAll中使用它时,它并没有像我想要的那样运行。例如,如果我想用“google.com”替换“stackoverflow.com”并且还想捕获 ftp,我会使用 str.replaceAll("(?:http|ftp)://...", " google.com") 但结果只是“google.com” -
非捕获组 (
(?:...)) 仅影响 组,而不影响匹配本身。请参阅 stackoverflow.com/questions/3512471/non-capturing-group 上的一个很好的示例,其中非匹配组http仍然是匹配的一部分,但不在组中。