【问题标题】:Replacing all strings int java source code替换所有字符串 int java 源代码
【发布时间】:2021-07-14 20:14:44
【问题描述】:

我正在尝试替换 Java 格式源代码中的每个声明的字符串(使用 java 本身)。从中删除字符串的源代码可能如下所示(>...

package a.b;

import b.a.*;

@SomeAnnotation(>"abc"<)
public class XY extends YZ {

    String s = >"Hello \"World\""<;

    public static void main(String[] args) {
        System.out.println(>"Hello World"<);
    }
}

想象一下,这一切都存储在一个字符串中,可能没有换行符。我现在需要一个可以找到所有这些的正则表达式。我在使用字符串中的转义引号时遇到问题。我最好的选择是".*[^\]"

cmet里面是否会检测到这些无关紧要,只要不超出注释即可。

【问题讨论】:

  • 用什么替换它,目的是什么?您最好在 intellij 之类的 IDE 中执行此操作,您可以将搜索限制在字符串文字内,而不是尝试自己执行。
  • 你应该寻找一些java解析库。正则表达式不适合这种情况。
  • @Andy turner 这不适用于在开发期间编辑源文件。我正在开发一个程序,该程序接受一个有效java语法的字符串,编译并加载类。在编译代码之前,我必须弄清楚类和包名以适当地命名文件并将其放入正确的目录中。但我不能简单地搜索“类”来查找类名位置,因为可能有一些注释或注释带有包含该短语的字符串,所以我想先将其删除(将其替换为“...”或所以)
  • 您根本无法使用正则表达式解析 Java,因为它不是正则语言——正如您所说的“因为可能有一些注释或注释”。使用编译器 API 检查抽象语法树。
  • 这正是问题所在 - 我想编译字符串,但只能通过创建具有适当名称的文件来实现。不过,我已经解决了这个问题,首先将字符串解析为 java 标记,然后过滤掉注释标记并跳到包/类类型标记来评估名称和包。

标签: java regex pattern-matching


【解决方案1】:

如果您使用 BufferedLineReader 在另一个 java 应用程序中读取源代码并检查每一行,您可能会使用以下正则表达式:

(?:\>\")(([\w\s]*)(\\"(?!\<)))*(?:\"\<)

但是,在 java replace 方法中使用时,您可能希望转义所有反斜杠。

例如:

lineAsString.replace((?:\\>\\")(([\\w\\s]*)(\\\\"(?!\\<)))*(?:\\"\\<),"youReplacementString");

可能需要额外的转义序列。此外,您可能希望在\w\s 旁边的字符串中添加更多特殊字符。

我建议将该正则表达式粘贴到 https://regex101.com/ 之类的正则表达式检查器和您的示例代码中以获得更多解释。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-12-31
    • 2016-08-23
    • 2012-09-05
    • 1970-01-01
    • 1970-01-01
    • 2016-04-12
    • 2019-06-16
    • 2013-01-04
    相关资源
    最近更新 更多