91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

String.replaceAll方法有什么用

發布時間:2021-08-18 13:51:01 來源:億速云 閱讀:174 作者:小新 欄目:編程語言

這篇文章將為大家詳細講解有關String.replaceAll方法有什么用,小編覺得挺實用的,因此分享給大家做個參考,希望大家閱讀完這篇文章后可以有所收獲。

示例

String str1 = "createTime";
String str2 = "createTimeAt";
String regex = "([A-Z])+";

System.out.println(str1.replaceAll(regex, "_$1").toLowerCase());
System.out.println(str2.replaceAll(regex, "_$1").toLowerCase());

//result
//create_time
//create_time_at

通過輸出可以看到,這段代碼的作用是把駝峰命名格式的字符串替換成下劃線分割,這個功能比較簡單,但是吸引我的卻是他的代碼。

"createTime".replaceAll("([A-Z]+)","_$1")

這行代碼簡單的很,就是調用了String類的replaceAll方法,方法的第一個參數是正則表達式,第二個參數是將要被替換成的新值。

讓我驚奇的是他代碼中,replaceAll的第二個參數,也就是JDK文檔中名為replacement的參數,竟然是_$1。這是什么鬼?還支持類似占位符這樣的東西?我一直都不知道。

問題探索

由于之前研究過一段正則表達式,通過觀察replaceAll的第一個參數([A-Z]+),我猜想,這個應該是用到了正則表達式的分組,對應JDK中,就是java.util.regex.Matcher類的group()方法。

在Linux的Sed命令上,就使用&進行了一些替換,道理應該是相通的。

于是看了下String.replaceAll方法是如何實現的。JDK:

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

哦,原來它底層就是用了Matcher,只不過用的是Matcher自己的replaceAll方法。

去看它的文檔,這個方法的參數果然有鬼,看下面實現代碼。

public String replaceAll(String replacement) {
    reset();
    boolean result = find();
    if (result) {
      StringBuilder sb = new StringBuilder();
      do {
        appendReplacement(sb, replacement);
        result = find();
      } while (result);
      appendTail(sb);
      return sb.toString();
    }
    return text.toString();
  }

里面關鍵的部分就是文檔中說的appendReplacement方法,然后可以看到詳細的描述文檔。

看到這里明白了,原來這個方法的replacement參數可以通過$字符來指代Matcher通過正則匹配得到的分組,支持name和number 兩種方式,這里對應的就是Matcher類的group(name)和group(int)兩個方法。

結論

1、String的replaceAll方法實際上是通過java.util.regex.Matcher類的replaceAll()方法實現的。

2、java.util.regex.Matcher類的replaceAll方法又是通過調用appendReplacement方法實現替換邏輯

3、Matcher類的appendReplacement方法的replacement參數支持通過$符號來指代Matcher匹配的分組

下面這串代碼,就是使用Matcher類分組的一個最佳實踐。

String data = "哈哈哈,xjjdog的手機號碼是:12345678901,你會打給我嗎";
//通過Matcher的分組功能,可以提取出上面字符串中的手機號
Matcher matcher = Pattern.compile(".*(xjjdog的手機號碼是:([0-9]{11}))").matcher(data);
while (matcher.find()) {
  System.out.println("G0:" + matcher.group(0));
  System.out.println("G1:" + matcher.group(1));
  System.out.println("G2:" + matcher.group(2));
}
//result
//G0:哈哈哈,xjjdog的手機號碼是:12345678901
//G1:xjjdog的手機號碼是:12345678901
//G2:12345678901

group(0)表示整個字符串

group(1)表示第一個匹配的,上面的例子中就是(我的手機號碼是:([0-9]{11}))部分

group(2)表示第二個匹配的,上面的例子中就是([0-9]{11})部分

使用分組可以用來提取字符串中的目標字符串值,很好用!

幾個例子

下面是幾個例子,大家可以觸類旁通。

駝峰轉下劃線命名

public static String camelToUnderline(String camelName) {
return camelName.replaceAll("([A-Z]+)", "_$1").toLowerCase();
}

下劃線轉駝峰

這個稍微麻煩點,是模仿者Matcher.replaceAll方法寫的。

public static String underlineToCamel(String underlineName) {
    Matcher matcher = Pattern.compile("(_[a-z]{1})").matcher(underlineName);
    StringBuffer result = new StringBuffer();
    while (matcher.find()) {
      String replacement = matcher.group(1);
      matcher.appendReplacement(result, replacement.replace("_", "").toUpperCase());
    }
    matcher.appendTail(result);
    return result.toString();
}

另外,Mybatis Generator插件源碼中的也提供了類似方法(JavaBeansUtil.getCamelCaseString),這里做了下簡單修改

 public static String getCamelCaseString(String inputString) {
    StringBuilder sb = new StringBuilder();
    boolean nextUpperCase = false;
    for (int i = 0; i < inputString.length(); i++) {
      char c = inputString.charAt(i);
      switch (c) {
        case '_':
        case '-':
        case '@':
        case '$':
        case '#':
        case ' ':
        case '/':
        case '&':
          if (sb.length() > 0) {
            nextUpperCase = true;
          }
          break;
        default:
          if (nextUpperCase) {
            sb.append(Character.toUpperCase(c));
            nextUpperCase = false;
          } else {
            sb.append(Character.toLowerCase(c));
          }
          break;
      }
    }
    return sb.toString();
  }

關于“String.replaceAll方法有什么用”這篇文章就分享到這里了,希望以上內容可以對大家有一定的幫助,使各位可以學到更多知識,如果覺得文章不錯,請把它分享出去讓更多的人看到。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

贺州市| 阿荣旗| 石阡县| 原平市| 普兰店市| 常熟市| 南平市| 兴隆县| 藁城市| 弥勒县| 滨海县| 湄潭县| 道真| 泰安市| 新龙县| 仪征市| 厦门市| 布尔津县| 石狮市| 德州市| 茶陵县| 喜德县| 雷波县| 沙洋县| 高要市| 竹山县| 临海市| 阿图什市| 靖州| 江华| 沁阳市| 崇明县| 娱乐| 黄石市| 河东区| 龙门县| 德令哈市| 芦山县| 灯塔市| 乐至县| 灵台县|