0

日志文件的这些模式在一行中出现多次。例如文件可能看起来像

dsads utc-hour_of_year:2013-07-30T17 jdshkdsjhf utc-week_of_year:2013-W31 dskjdskf
utc-week_of_year:2013-W31 dskdsld  fdsfd
dshdskhkds utc-month_of_year:2013-07 gfdkjlkdf

我想用“Y”替换所有日期特定信息

我试过:replaceAll("_year:.*\s", "_year:Y");` 但它会删除第一次替换后发生的所有内容,因为 .* 的贪婪匹配

dsads utc-hour_of_year:Y
utc-week_of_year:Y
dshdskhkds utc-month_of_year:Y

但预期的结果是:

dsads utc-hour_of_year:Y jdshkdsjhf utc-week_of_year:Y dskjdskf
utc-week_of_year:Y dskdsld  fdsfd
dshdskhkds utc-month_of_year:Y gfdkjlkdf
4

2 回答 2

1

我不确定您真正想要做什么,这个答案仅基于您的示例。如果您想做其他事情,请在下面留下评论或使用更具体的信息/示例编辑您的问题

之后它会删除所有内容,_year:因为您正在使用.*\\s这意味着

  • .*零个或多个任意字符(新行旁边),
  • \\s和它之后的空间

所以在句子

utc-hour_of_year:2013-07-30T17 dsfsdgfsgf utc-week_of_year:2013-W31 dsfsdgfsdgf

它会匹配

utc-hour_of_year:2013-07-30T17 dsfsdgfsgf utc-week_of_year:2013-W31 dsfsdgfsdgf
//               ^from here                                to here^

因为默认* 量词是贪婪的。为了让它不情愿,你需要在?之后添加,*所以试试吧

  • "_year:.*?\\s"

或者甚至更好,而是.*?只匹配非空格字符,使用\\Swhich 与 negation 相同\\s,可以写为[^\\s]. 此外,如果您的数据可以在输入的末尾,则您不应该\\s在正则表达式的末尾添加替换中的空格,因此请尝试其中一种方法

  • .replaceAll("_year:\\S*", "_year:Y")
  • .replaceAll("_year:\\S*\\s", "_year:Y ")
于 2013-07-30T18:17:34.400 回答
1

尝试使用不情愿的量词:_year:.*?\s.

.replaceAll("_year:.*?\\s", "_year:Y ")

System.out
        .println("utc-hour_of_year:2013-07-30T17 dsfsdgfsgf utc-week_of_year:2013-W31 dsfsdgfsdgf"
                .replaceAll("_year:.*?\\s", "_year:Y "));
utc-hour_of_year:Y dsfsdgfsgf utc-week_of_year:Y dsfsdgfsdgf
于 2013-07-30T18:03:17.180 回答