Java 正则表达式 : Capture part after a character but don't replace the character

标签 java regex

我正在使用 Java 来解析 JavaScript 文件。因为范围与我使用它的环境中的预期不同,所以我尝试替换 i.e. 的每个实例

test = value

window.test = value

以前,我刚刚使用过

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

这显然不可推广,但对于固定数据集来说它工作得很好。

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

窗口['test'] = 值

([[测试]])

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

这对我来说是一个新情况,因为我没有太多地使用正则表达式进行替换,只是进行模式匹配。所以我环顾四周,找到了我认为的解决方案,称为“非捕获组”。 Oracle 页面上的解释听起来像是我正在寻找的内容,但是当我将正则表达式重写为 (?:[^'\\[])test 时,它的行为完全是就像我没有更改任何内容一样 - 替换 test 前面的字符。我环顾了 StackOverflow,但我的发现让我更加确信我所做的事情应该有效。

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

最佳答案

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

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

尝试:

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

替换字符串中的 $1 是对捕获组 1 匹配内容的反向引用。在本例中,这是测试之前的字符

关于Java 正则表达式 : Capture part after a character but don't replace the character,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13808123/

相关文章:

java - 在 firebase android 中拯救一个 parent 下的许多 child

java - 在 JBOSS 5.0.1 中访问 ServicePOJO 时出错

java - 为什么代理 java 正则表达式会找到连字符 -

python - Django 中字母数字(slug)字符串的 URL 模式

javascript - 从字符串中删除点和空格

java - 使用正则表达式解析地址

java - 是否可以从配置服务器加载 log4j2 配置?

java - Activity 不会以 "startActivity();"开始

java - Struts 2 - 禁用操作类中的提交按钮

java - 使用 clojure 中的正则表达式实现简单的扫描器/分词器