2017-02-18 66 views
0

我有三個串應用程序,app_abc,appabc我想與代碼(更換)取代任何的字符串輸出應該替換使用正則表達式的特定字,除了一種情況下

  • 應用 - >代碼,
  • app_abc - > code_abc,
  • appabc - > appabc

我試過這個replaceAll(「^ app」,code); 但它會啓動應用程序

輸出錯誤更換:

  • 應用程序 - >代碼,
  • app_abc - > code_abc,
  • appabc - > codeabc(我想排除這種類型的字符串使用正則表達式)

我知道我有能力使用或oprator ,所以我已經嘗試了本

replaceAll("^app|app_(?!(.*))", code); 

https://regex101.com/r/Ils9kM/1

,但它是錯誤的,我認爲任何人都可以提出?

+0

你不必使用交替(* OR *運算符)或前瞻。您需要一個可選的捕獲組和字邊界。 –

+0

你能舉個例子嗎? –

+0

先生@GrzegorzGórkiewicz我有另一個問題,請閱讀它是爲了替換確切的單詞,但我有3個案例不使用重複標誌只有問題有相同的字符串 –

回答

2

您只想在單詞的開頭替換abc,並且只有當它沒有跟在另一個字母后面時。使用

replaceAll("\\bapp(?![a-zA-Z])", "code") 

如果你想abc應遵循的字邊界或下劃線,圖案也可以

"\\bapp(?=\\b|_)" 
+0

你是否推薦任何有關正則表達式的深入Java教程? –

+1

由於我現在正在使用移動設備,因此我無法添加更多詳細信息。@ Grzegorz,對不起,我不知道特定的Java相關正則表達式教程,有regexone.com for JavaScript。很多可以在regular-expressions.info找到。 –

0

試試這個:

public static void main(String []args){ 
     Assert.assertEquals("code", repl("app")); 
     Assert.assertEquals("code_abc",repl("app_abc")); 
     Assert.assertEquals("appabc",repl("appabc")); 
     Assert.assertEquals("appa_bc",repl("appa_bc")); 
     Assert.assertEquals("fooapp",repl("fooapp")); 
     Assert.assertEquals("foo_app",repl("foo_app")); 
     System.out.println("All Good"); 
    } 

    private static String repl(final String str) { 
     return str.replaceAll("\\bapp(?![a-zA-Z])", "code"); 
    } 
相關問題