正则表达式匹配 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
:
- 以
begin of line
、line break
、space
或 .
开头(静态内部 classes 的点)
- 并以
<
(泛型)、.
(静态方法调用或静态内部 class)或 (
(新实例) 结尾
问题是,如果 sourceCode
已经包含完全限定的 class 名称,它将再次替换。例如:sourceCode
包含 java.util.Random
,这将被替换为 java.util.java.util.Random
我正在尝试找到一种方法来向正则表达式的第一部分添加一条规则:
- 且不包含
fullyQualifiedClassName.replace(className, "")
任何帮助将不胜感激。
编辑:一个例子,
这是一个愚蠢的例子,但它显示了缺少的东西。
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|[<.(])";
说明"
(?<=^|\s)
- 正后视要求字符串的开头或空格位于字符串中当前位置的正前方
(?<!\.)
- 如果 .
正好在当前位置 之前,则匹配失败的否定后视
- className - class 的变量(注意在这种情况下你不必使用
Pattern.quote
因为它应该只包含 "word" 个字符)
(?=\b|[<.(])
- 正向前瞻,需要单词边界或 <
或 .
或 (
紧跟在 class 名称之后。
我正在 Java 中做一个代码生成器,我正在为这个正则表达式而苦苦挣扎。
我需要找到 String sourceCode
中的每个 classname
并将它们替换为 fullyQualifiedClassName
。
使用以下代码...
String regex = "(?<=(^|\n| |\.))" + className + "(?=(<|\.|\())";
val = val.replaceAll(regex, fullyQualifiedClassName);
...我可以匹配每个 classname
:
- 以
begin of line
、line break
、space
或.
开头(静态内部 classes 的点) - 并以
<
(泛型)、.
(静态方法调用或静态内部 class)或(
(新实例) 结尾
问题是,如果 sourceCode
已经包含完全限定的 class 名称,它将再次替换。例如:sourceCode
包含 java.util.Random
,这将被替换为 java.util.java.util.Random
我正在尝试找到一种方法来向正则表达式的第一部分添加一条规则:
- 且不包含
fullyQualifiedClassName.replace(className, "")
任何帮助将不胜感激。
编辑:一个例子,
这是一个愚蠢的例子,但它显示了缺少的东西。
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|[<.(])";
说明"
(?<=^|\s)
- 正后视要求字符串的开头或空格位于字符串中当前位置的正前方(?<!\.)
- 如果.
正好在当前位置 之前,则匹配失败的否定后视
- className - class 的变量(注意在这种情况下你不必使用
Pattern.quote
因为它应该只包含 "word" 个字符) (?=\b|[<.(])
- 正向前瞻,需要单词边界或<
或.
或(
紧跟在 class 名称之后。