正则表达式匹配 class 没有完全限定名称的名称

Regex to match class name without fully qualified name

我正在 Java 中做一个代码生成器,我正在为这个正则表达式而苦苦挣扎。

我需要找到 String sourceCode 中的每个 classname 并将它们替换为 fullyQualifiedClassName

使用以下代码...

String regex = "(?<=(^|\n| |\.))" + className + "(?=(<|\.|\())";
val = val.replaceAll(regex, fullyQualifiedClassName);

...我可以匹配每个 classname

问题是,如果 sourceCode 已经包含完全限定的 class 名称,它将再次替换。例如:sourceCode 包含 java.util.Random,这将被替换为 java.util.java.util.Random

我正在尝试找到一种方法来向正则表达式的第一部分添加一条规则:

任何帮助将不胜感激。

编辑:一个例子,

这是一个愚蠢的例子,但它显示了缺少的东西。

Random r = new java.util.Random();

在上面的代码中,我调用replaceAll时应该替换第一个Random,第二个Random不应该被匹配。

我在处理器代码中可以轻松获得变量

String className = "Random";
String fullyQualifiedClassName = "java.util.Random";
String package = fullyQualifiedClassName.replace(className, "");

要点是,完全限定名称不应以 . 开头。所以,你需要使用负向回顾(?<!\.)。此外,\n 是空格,您可以将这些部分缩小到 \s。在前瞻中,您还将单个字符与交替组匹配,而字符 class 更适合此任务。

所以,使用

String regex = "(?<=^|\s)(?<!\.)" + className + "(?=\b|[<.(])";

regex demo

说明"

  • (?<=^|\s) - 正后视要求字符串的开头或空格位于字符串中当前位置的正前方
  • (?<!\.) - 如果 . 正好在当前位置
  • 之前,则匹配失败的否定后视
  • className - class 的变量(注意在这种情况下你不必使用 Pattern.quote 因为它应该只包含 "word" 个字符)
  • (?=\b|[<.(]) - 正向前瞻,需要单词边界或 <.( 紧跟在 class 名称之后。