【问题标题】:Java RegExp: Capture part after a character but don't replace the characterJava RegEx:捕获字符后的部分但不替换字符
【发布时间】: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,但我发现的只是让我更加确信我正在做的事情应该有效。

我做错了什么,它没有按预期工作?我是否滥用了模式?

【问题讨论】:

标签: java regex


【解决方案1】:

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

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

尝试:

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

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

    • 我给出的例子并不全面——也有一些地方是 test.n = 5 或 x = test.a.b.c.d.substring(4, 2);。在那种情况下,我希望它变成 window.test.a.b.c.d...
    • 好的,那很好,我只是想提一下,有时匹配您实际想要匹配的内容更容易 - 或多或少是相反的正则表达式。
    猜你喜欢
    • 1970-01-01
    • 2015-04-17
    • 1970-01-01
    • 2013-05-11
    • 2016-09-22
    • 2013-09-30
    • 2010-10-13
    • 1970-01-01
    • 2013-08-26
    相关资源
    最近更新 更多