跳过某些字符之间的正则表达式匹配

时间:2016-03-22 04:48:22

标签: java regex

在以下程序中,我尝试为以" _"开头的任何文本添加前缀。用" app":

 String s = "C_NAME=\"usco _f2 re_col\" &&_f1=\"ot\" && _f1 = \"fd\"|stats count(_f1)|fields _f1, f3|filter match(app_f1,\"get\")|extract field=\".*?\\[\\d+\\s+(?<_LogLevel>\\w+).*";

        StringBuilder s1 = new StringBuilder(s);
        java.util.regex.Pattern p = java.util.regex.Pattern.compile(".*?((?<!\\w)_\\w+).*?",
                Pattern.UNICODE_CHARACTER_CLASS);
        Matcher m = p.matcher(s);
        while (m.find()) {
            String fieldname = m.group(1);
            s1.replace(m.start(1), m.end(1), "app" + fieldname);
                m.reset(s1);

        }
        System.out.println(s1.toString());

但是,我还有一个条款需要注意:上述正则表达式不应该附加文本&#34; app&#34;以&#34; _&#34;开头的文本如果文本位于一对双引号之间。在这个特定的例子中,文本&#34; _f2&#34;不应该加上前缀。有关如何实现此功能的任何线索?

更新

以下正则表达式在我的案例中工作正常:

Pattern p = Pattern.compile(".*?(?:\"[^\"]*\"|((?<!\\w)_\\w+)).*?",
                Pattern.UNICODE_CHARACTER_CLASS);

1 个答案:

答案 0 :(得分:3)

由于(*SKIP)(*FAIL)中未实现Java,因此您需要自行提出一些逻辑:

What_I_want_to_avoid|(What_I_want_to_match)

所以,在你的情况下:

"[^"]*"|(\b_\w+)
# left: anything between two double quotes
# right: a word boundary, an underscore and at least one word character

匹配左侧分支中不需要的所有内容,如果组1存在,请在此处进行替换 请参阅a demo on regex101.com