2017-02-23 32 views
0

考慮我有這個字符串這裏用另一個替換第一和最後一個字符:爪哇 - 正則表達式中的ONE SHOT

[Hel[don't change in the middle]lo] 

我如何與另一個字符這樣的替換第一和最後一個支架

#Hel[don't change in the middle]lo# 

我知道這是可能是這樣的:

String str = "[Hel[don't change in the middle]lo]"; 
str = str.replaceFirst("\\[", "#"); 
if (str.substring(str.length() - 1).equals("]")) { 
    str = str.substring(0, str.length() - 1) + "#"; 
    System.out.println(str); 
} 

是否有任何其他簡單的方法使用正則表達式,所以我可以替換第一個 和最後一個在一個鏡頭?

這樣的:

str = str.replace("myregex"); 
+0

注意:不要寫'str.substring(str.length() - 1).equals( 「]」))',這造成不必要的字符串。使用'str.charAt(str.length() - 1)==']''。 –

+0

mmm,謝謝@AndyTurner這是正確的 –

回答

3

這將是不夠的:

System.out.println(str.replaceAll("^\\[(.*)]$", "#$1#")); 
+0

這給我看看#Hel [不要在中間改變#lo#'它改變了最後一個,也改變了內部的字符串,這是不正確的 –

+0

葉頁。我想這是因爲第二個']'沒有被轉義。似乎很好,否則。 – Izruo

+0

是的,現在它的工作謝謝 –

2

你可以做

str = str.replaceAll("^\\[|]$", "#"); 
+0

oohh這麼快哈哈,是的這是正確的 –

1

您可以使用:

String repl = str.replaceAll("^([^\\[]*)\\[|\\]([^\\]]*)$", "$1#$2"); 

RegEx Demo

在這裏,我們使用2個子匹配是之間交替:

  • ^([^[]*)\\[ - 匹配0個或更多的字符,隨後[在啓動
  • \\]([^]]*)$的 - 匹配後跟0個或多個字符的]在端

PS:這也會照顧一些任意字符,然後在輸入中首先輸入[]

+0

這給我看一個錯誤'java.util.regex.PatternSyntaxException:未接近索引20的字符類' –

+0

這仍然顯示我'#Hel [如果我最後不使用'#',請不要在中間#lo'中改變,它會改變最後一個,但是在中間,這不正確 –

+0

它只是先改變'['和last']' 。 [檢查此演示](https:// regex101。com/r/QxKQUA/4) – anubhava

1

如果操作就是這麼簡單,不要使用正則表達式:

StringBuilder sb = new StringBuilder(str); 
sb.set(0, '#'); 
sb.set(str.length()-1, '#'); 
String result = sb.toString(); 

你也可以寫一個表達式:

String result = 
    new StringBuilder(str.length()) 
     .append('#') 
     .append(str, 1, str.length()-1) 
     .append('#') 
     .toString(); 

如果要替換的字符不在開頭和結尾,請用搜索它們和lastIndexOf

sb.set(str.indexOf('['), '#'); 
sb.set(str.lastIndexOf(']'), '#'); 
+0

謝謝@Andy Turner在另一個案例中也可以幫助其他人;) –

相關問題