2017-08-15 28 views
0

我有一個數組列表應用正則表達式來Java8列表<String>

List<String> items = Arrays.asList("date=2017-01-10", "date=2017-02-10");

我想轉換此列表,併爲每個項目的報價在列表中, date=2017-01-10可以轉換爲date='2017-01-10'

List<String> items = Arrays.asList("date='2017-01-10'", "date='2017-02-10'");

我該如何在Java 8中做什麼?

更新:我想用正則表達式來實現這一點。

+0

要在Java 8中執行此操作,請先嚐試使用正則表達式在Java 7中執行此操作,然後......保持原樣,因爲Java8除了輕微的生活質量改進之外,不會爲此錶帶來任何新內容。 –

+1

@ M.Prokhorov,Streams? – Clijsters

+0

@Clijsters,這項任務的「生活質量改善」的定義。使用Stream無法實現的任何功能都無法通過Java7風格的代碼實現。 –

回答

2

我已經看到您的個人資料,我發現你開始去渣。所以我會給你答案只是爲了學習的目的。

  • 使用lookbehind跳過替換。 e.g:(?<==)
  • 使用group捕捉匹配結果在基,e.g:(.+)
  • 使用$標誌到捕獲的組,e.g引用:$1

    List<String> result = items.stream() 
    //         match `=`   ---v 
              .map(it -> it.replaceFirst("(?<==)(.+)", "'$1'")) 
    //      capture the rest substring in group ---^ 
              .collect(Collectors.toList()); 
    

你也可以簡單地使用String#substring來實現自己的方式。例如:

int prefix = "date=".length(); 
List<String> result =items.stream() 
          .map(it->String.format("date='%s'",it.substring(prefix))) 
          .collect(Collectors.toList()); 
0

您可以使用下面的代碼

List<String> items = Arrays.asList("date=2017-01-10", "date=2017-02-10"), result = new ArrayList<String>(); 
    for(String item : items){ 
     item = item.replace("date=", "date='"); 
     item = item + "'"; 
     result.add(item); 
    } 
    for(String item : result){ 
     System.out.println(item); 
    } 

demo

2

您可以使用replaceAll與此正則表達式^(.*?)=(.*?)$其返回兩個羣體之一=前一秒後,這樣你就可以接着='組1 $1更換輸入然後兩個引號'$2'之間的第2組:

List<String> items = Arrays.asList("date=2017-01-10", "date=2017-02-10"); 
items = items.stream() 
     .map(t -> t.replaceAll("(.*?)=(.*?)$", "$1='$2'")) 
     .collect(Collectors.toList()); 

items.forEach(System.out::println); 

輸出

date='2017-01-10' 
date='2017-02-10'