在以下程序中,我尝试为以" _"开头的任何文本添加前缀。用" 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);
答案 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。