歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
您现在的位置: Linux教程網 >> UnixLinux >  >> Linux編程 >> Linux編程

Java中的字符替換

在JDK的String類中,提供了replace、relaceAll、replaceFirst三個方法用於字符替換,其中replaceFirst通過字面理解就是替換匹配的第一個字符;而replace、relaceAll都是全部替換的意思

那這三個有什麼本質上的區別呢??

下面看一個例子,需要將字符串"orange.peach.banana.tomato"中的所有"."替換為"|",

package com.yf.str;

public class ReplaceStr {

 public static void main(String[] args) {
  String str="orange.peach.banana.tomato";
  System.out.println(str.replace(".", "|"));
  System.out.println(str.replaceAll(".", "|"));
  System.out.println(str.replaceFirst(".", "|"));
 }

}

輸出結果如下

orange|peach|banana|tomato
||||||||||||||||||||||||||
|range.peach.banana.tomato

從結果可以看出,第一個是我們想要的結果,而後面兩個都不是我們預期的答案,這是為什麼呢??

看看String類中源碼實現:

首先看看replace的實現(已經通過注釋解答邏輯)

 public String replace(char oldChar, char newChar) {
 if (oldChar != newChar) {
    int len = count;
    int i = -1;
    char[] val = value; /* avoid getfield opcode */
    int off = offset;  /* avoid getfield opcode */
   
    //找到第一個需要替換字符的位置
    while (++i < len) {
  if (val[off + i] == oldChar) {
      break;
  }
    }
    //將第一個需要替換的字符前面部分拷貝出來
    if (i < len) {
  char buf[] = new char[len];
  for (int j = 0 ; j < i ; j++) {
      buf[j] = val[off+j];
  }
  //從第一個需要替換的字符開始,替換後面所有的字符
  while (i < len) {
      char c = val[off + i];
      buf[i] = (c == oldChar) ? newChar : c;
      i++;
  }
  //返回新的字符串
  return new String(0, len, buf);
    }
 }
 return this;
    }

很明顯,replace直接就是要字符匹配,相當於匹配ASSIC碼,它遍歷字符數組中的每一個元素,判斷字符是否與'.'相等,如果相等則替換,所以它能將字符串裡面所有的"."全部替換為"|"。

再看看replaceAll的邏輯

public String replaceAll(String regex, String replacement) {
     //解析正則表達式,然後替換匹配的正則
 return Pattern.compile(regex).matcher(this).replaceAll(replacement);
    }

replaceAll與replace本質區別在於其是用正則的方式匹配,它傳入的是一個正則表達式,而在正則表達式中"."表示的任意字符,所以上面調用replaceAll後會將所有字符都替換為"|"。那麼很容易推測出replaceFirst也是通過正則匹配,而實際上它也確實這麼做的

public String replaceFirst(String regex, String replacement) {
 return Pattern.compile(regex).matcher(this).replaceFirst(replacement);
    }

那麼上面的代碼的正確方式是將replaceAll、replaceFirst的輸入轉義,轉為真正的"."

String str="orange.peach.banana.tomato";
System.out.println(str.replace(".", "|"));
System.out.println(str.replaceAll("\\.", "|"));
System.out.println(str.replaceFirst("\\.", "|"));

輸出結果如下:

orange|peach|banana|tomato
orange|peach|banana|tomato
orange|peach.banana.tomato

需要注意一下String.split(String regex)、String.matches(String regex)等都是通過正則匹配來做判斷的(只有replace通過判斷字符是否相等)

Copyright © Linux教程網 All Rights Reserved