我想使用具有以下条件的正则表达式替换文本文件中的变量名:
让我们举个例子,我想将log
替换为LOG
import
开头,那么我不想替换它。例如import com.test.log.myfile;
的导入和日志之间的距离最大为1000→我不想在这里替换除了上述2个条件之外,我想像这样在各处进行更改:
log="log" ; // should be LOG="log";
log.test(); // should be LOG.test();
我使用了以下正则表达式,但它满足了我的第二个和第三个条件,但没有满足第一个条件: Link
(\blog\b)(?=(?:[^\"]|[\"][^\"]*[\"])*$)
有人可以帮助我进行或修复该问题吗?
答案 0 :(得分:0)
您可以使用环视功能来确定它是否被引号引起来。
Like this (?<!")log(?!")
,或者如果您使用的语言不支持环视,则
You can use this (?:[^"]|^)(log)(?:[^"]|$)
请记住,如果使用第二个,您将要替换捕获组1,而不是整个匹配项。如您在我的示例中所见,如果您使用完整匹配,它将在“ log”之前和之后剪切字母(或换行符)。
答案 1 :(得分:0)
鉴于您当前的要求和限制,您可以使用以下符合Java regex的模式:
s.replaceAll("(?<!^import\\b.{0,1000})\\b(log)\\b(?=(?:[^\"]|\"[^\"]*[\"])*$)", "LOG")
请参见Java demo here。
详细信息
(?<!^import\\b.{0,1000})
-如果当前位置的前面是import
,并且字符串开头(如果是{使用了{1}}标志)Pattern.MULTILINE
-第1组:\\b(log)\\b
个完整单词log
-在(?=(?:[^\"]|\"[^\"]*[\"])*$)
之后的两个引号内不应包含"
个字符,或者在两个引号内可以有任意数量的子字符串。