gpt4 book ai didi

java - 如何在 Java 中编写一个正则表达式来对不在注释中的组执行 .replaceFirst ?

转载 作者:行者123 更新时间:2023-12-01 17:26:06 27 4
gpt4 key购买 nike

因此,我需要返回修改后的字符串,其中它用另一个 token 替换 token 的第一个实例,同时跳过注释。这是我正在讨论的示例:

This whole quote is one big String
-- I don't want to replace this @@
But I want to replace this @@!

作为一名前 .NET 开发人员,我认为这很容易。我只是像这样进行消极的回顾:

(?<!--.*)@@

但后来我了解到 Java 无法做到这一点。因此,在得知花括号没问题后,我尝试了以下方法:

(?<!--.{0,9001})@@

这并没有引发异常,但它确实与注释中的 @@ 匹配。

当我使用 Java 正则表达式测试器测试此正则表达式时,它按预期工作。我唯一能想到的是我正在使用 Java 1.5。 Java 1.5 的正则表达式引擎是否有可能存在错误?假设确实如此,我如何让 Java 1.5 做我想做的事情而不需要分解我的字符串并重新组装它?

编辑 我将 # 更改为 -- 运算符,因为看起来正则表达式会更复杂,使用两个字符而不是一个字符。我最初没有透露我正在修改查询,以避免偏离主题的讨论“那么你不应该那样修改查询!”我这样做有一个很好的理由。请不要讨论查询修改的良好实践。谢谢

最佳答案

这里你真的不需要消极的后视。没有它你也可以做到。

它会是这样的:

String str = "I don't want to replace this @@";     
str = str.replaceAll("^([^#].*?)@@", "$1");

因此,它会将不以 # 开头的字符串中第一次出现的 @@ 替换为 @@ 之前的字符串部分>。因此,@@ 被删除。这里 replaceAll 之所以有效,是因为它使用了一个不情愿的量词 - .*?。因此,它会自动停止在第一个 @@ 处。

<小时/>

正如 @nhahtdh 在评论中正确指出的那样,如果您的评论位于行尾,则这可能会失败。所以,你可以使用这个:

String str = "I don't want to # replace this @@";
str = str.replaceAll("^([^#]*?)@@", "$1");

这适用于任何情况。在给定的示例中,它不会替换 @@,因为它是注释的一部分。

<小时/>

如果您的评论开头由两个字符表示,则否定字符类将不起作用。您需要像这样使用否定前瞻:

String str = "This whole quote @@  is one big String -- asdf @@\n" +
"-- I don't want to replace this @@\n" +
"But I want to replace this @@!";
str = str.replaceAll("(?m)^(((?!--).)*?)@@", "$1");

System.out.println(str);

输出:

This whole quote   is one big String -- asdf @@
-- I don't want to replace this @@
But I want to replace this !
模式开头的

(?m) 用于启用 MULTILINE 匹配模式,因此 ^ 将匹配开头每行的开头,而不是整个表达式的开头。

关于java - 如何在 Java 中编写一个正则表达式来对不在注释中的组执行 .replaceFirst ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14882787/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com