2013-07-30 87 views
0

日誌文件的這些模式在一行中出現多次。 例如文件可能看起來像Java正則表達式:需要一個正則表達式來匹配指定的所有格式

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( 「_年:。* \ 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 

回答

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 
1

我不知道你真正想要做的,這個答案只是根據你的榜樣。如果你想要做以下別的事情請假評論或更具體的信息/例子編輯你的問題

它刪除,因爲你正在使用.*\\s_year:之後的一切,這意味着

  • .*零個或多個的任何(旁邊新行)字符,
  • \\s和空間後

所以在句子

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

將默認*quantifier is greedy匹配

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

因。爲了讓捨不得你需要*後加入?所以儘量也許

  • "_year:.*?\\s"

,甚至更好,而不是.*?比賽只能用\\S非空格字符,這是一樣的\\s否定,可以寫爲[^\\s]。此外,如果你的數據可以在你輸入結束時,你不應該可能是在您的正則表達式和空間,在你更換的末尾添加\\s,所以儘量也許這種方式之一

  • .replaceAll("_year:\\S*", "_year:Y")
  • .replaceAll("_year:\\S*\\s", "_year:Y ")
+0

+1列出了一些替代品 - 以及所有正確的AFAICS。 – usr2564301

+0

謝謝,?是的。 –

+0

@SathiChowdhury yes'?'會讓'*'不願意,但我更喜歡'.replaceAll(「_ year:\\ S *」,「_year:Y」)'因爲它更短,更易於理解(至少對我而言) ,也會在字符串末尾替換'_year:',因爲後面沒有空格,所以''_year:\\ S * \'s「'不會。 – Pshemo