【问题标题】:How to create a regex that matches a specific text outside quotes如何创建与引号外的特定文本匹配的正则表达式
【发布时间】:2015-06-24 13:38:52
【问题描述】:

我正在寻找有关创建正则表达式以替换以下格式文本的帮助:

Replace the 3 words 'OR' and 'AND' and 'NOT' with '||', '&&' and '!' respectively. 
But don't replace it if those 3 words appear somewhere within quotes.

例如,句子

PANDA OR THOR AND "NOTHING OR EVERYTHING" NOT THINKING

应该改为

PANDA || THOR && "NOTHING OR EVERYTHING" ! THINKING

我正在使用 Java API String.replaceAll(regex, replacement) 来替换文本。

编辑:我不想在一个“replaceAll”语句中全部替换它们。我会一次更换一个。但我正在寻找关于正则表达式的帮助来替换它们。

【问题讨论】:

标签: java regex string replace


【解决方案1】:

你不能在一个replaceAll 中做到这一点,因为你只有一个替代品。考虑使用正则表达式来查找要替换的引号或部分。然后检查找到的匹配是否不是引号并将其替换为您想要的(您可以使用Matcher 及其appendReplacementappendTail 方法)。

所以你的代码看起来像

Pattern p = Pattern.compile("\"[^\"]+\"|\\bAND\\b|\\bOR\\b|\\bNOT\\b");
//                           "quotes"      AND       OR       NOT
Matcher m = p.matcher(text);

StringBuffer sb =new StringBuffer();

while(m.find()){
    String match = m.group();

    if (match.startsWith("\"")){//it is quotation, append it without changes
        m.appendReplacement(sb, match);
    }else if(match.equals("AND")){
        m.appendReplacement(sb, "&&");
    }else //...rest of your cases
}
m.appendTail(sb);

String result = sb.toString();

【讨论】:

  • 对不起。我不想在一个“replaceAll”语句中全部替换它们。我会一次更换一个。但我正在寻找关于正则表达式的帮助来替换它们。
  • @user2869520 用一个正则表达式语句是不可能的。
  • @user2869520:这种方法的好处是字符串只解析一次。
【解决方案2】:

您需要编写三个replaceAll 函数。

string.replaceAll("(?m)\\bOR\\b(?=(?:\"[^\"]*\"|[^\"])*$)", "||")
      .replaceAll("(?m)\\bAND\\b(?=(?:\"[^\"]*\"|[^\"])*$)", "&&")
      .replaceAll("(?m)\\bNOT\\b(?=(?:\"[^\"]*\"|[^\"])*$)", "!");

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-03-24
    • 2022-12-10
    • 2017-07-02
    • 1970-01-01
    • 1970-01-01
    • 2012-02-02
    • 2016-04-05
    • 1970-01-01
    相关资源
    最近更新 更多