正则表达式中的多个条件

时间:2018-07-18 15:33:43

标签: java regex

我想使用具有以下条件的正则表达式替换文本文件中的变量名: 让我们举个例子,我想将log替换为LOG

  1. 如果该行以import开头,那么我不想替换它。例如import com.test.log.myfile;的导入和日志之间的距离最大为1000→我不想在这里替换
  2. 如果它包含在双引号中,例如“ log”,那么我不想替换它。
  3. 除了上述2个条件之外,我想像这样在各处进行更改:

    log="log" ; // should be LOG="log";
    log.test(); // should be LOG.test();
    

我使用了以下正则表达式,但它满足了我的第二个和第三个条件,但没有满足第一个条件: Link

(\blog\b)(?=(?:[^\"]|[\"][^\"]*[\"])*$)

有人可以帮助我进行或修复该问题吗?

2 个答案:

答案 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-在(?=(?:[^\"]|\"[^\"]*[\"])*$)之后的两个引号内不应包含"个字符,或者在两个引号内可以有任意数量的子字符串。