Java-字符串处理

字符串处理

字符串的处理在编写代码中算是比较常见的工作。本篇博文将主要介绍Google Guava 中对字符串进行处理的工具包的使用。

  • 准备工作
    在 maven项目中导入guava依赖。
<dependency>
    <groupId>com.google.guava</groupId>
    <artifactId>guava</artifactId>
    <version>19.0</version>
</dependency>

连接器[Joiner]

@Test
public void test() {
     //连接字符串中的非空字符串
     Joiner joiner = Joiner.on("->").skipNulls();
     System.out.println(joiner.join("Messi", null, "Henry", "Lionel"));//Messi->Henry->Lionel

     //用指定字符串,如A 替换空字符串
     joiner = Joiner.on("->").useForNull("A");
     System.out.println(joiner.join("Messi", null, "Henry", "Lionel"));//Messi->A->Henry->Lionel

     //数组转换为字符串,中间以逗号隔开
     System.out.println(Joiner.on(",").join(Arrays.asList(1, 2, 3)));//1,2,3
}

拆分器[Splitter]

  • 拆分器方法。
方法描述范例
Splitter.on(char)按单个字符拆分Splitter.on(‘,’)
Splitter.on(CharMatcher)按字符匹配器拆分Splitter.on(CharMatcher.BREAKING_WHITESPACE)
Splitter.on(String)按字符串拆分Splitter.on(“abc“)
Splitter.on(Pattern),Splitter.onPattern(String)按正则表达式拆分Splitter.onPattern(“\r?\n”)
Splitter.fixedLength(int)按固定长度拆分;最后一段可能比给定长度短,但不会为空。Splitter.fixedLength(3)
  • 拆封器修饰符
方法描述
omitEmptyStrings()从结果中自动忽略空字符串
trimResults()移除结果字符串的前导空白和尾部空白
trimResults(CharMatcher)给定匹配器,移除结果字符串的前导匹配字符和尾部匹配字符
limit(int)限制拆分出的字符串数量

  • 代码示例
@Test
public void test1() {
    String[] res = " foo,bar,,   qux ".split(",");
    for (String item : res) {
        System.out.print(item + "->");//foo->bar->->   qux->
    }
    //忽略字符串中的所有空串
    Iterable<String> iterable = Splitter.on(",").trimResults().omitEmptyStrings().split(" foo,bar,,   qux ");
    for (String item : iterable) {
        System.out.print(item + "->");//foo->bar->qux->
    }
}

字符匹配器[CharMatcher]

CharMatcher提供了多种处理字符串处理的方法,其主要意图是:

  1. 找到匹配的字符;
  2. 处理匹配的字符。

对应上面两种意图,CharMatcher 内部实现也包含两部分:

  1. 实现大量共用内部类,用来方便匹配字符;
  2. 实现了许多处理字符串的方法,来处理匹配的字符。

常见的方法有:

方法描述
removeFrom(CharSequence)从字符序列中移除所有匹配字符。
retainFrom(CharSequence)在字符序列中保留匹配字符,移除其他字符。
trimFrom(CharSequence)移除字符序列的前导匹配字符和尾部匹配字符。
matchesAllOf(CharSequence)测试是否字符序列中的所有字符都匹配。

下面来看看对 CharMatcher 的示例,中间含有对应的注释,可以很好地理解程序的意思。

@Test
public void test3() {
    //去掉控制符,如(\t,\n,\b,...)
    String noControl = CharMatcher.JAVA_ISO_CONTROL.removeFrom("messi\t\n");
    System.out.println(noControl);//messi

    //只保留数字字符
    String theDigits = CharMatcher.DIGIT.retainFrom("messi1 2 3");
    System.out.println(theDigits);//123

    //去掉两端的空格,并把中间的连续空格替换成单个空格
    String spaced = CharMatcher.WHITESPACE.trimAndCollapseFrom(" me    ssi", '/');
    System.out.println(spaced);//me/ssi

    //所有数字替换成*
    String noDigits = CharMatcher.JAVA_DIGIT.replaceFrom("messi123431j", '*');
    System.out.println(noDigits);//messi******j

    //只保留数字和小写字母
    String lowerAndDigit = CharMatcher.JAVA_DIGIT.or(CharMatcher.JAVA_LOWER_CASE).retainFrom("MessiF123Fne");
    System.out.println(lowerAndDigit);//essi123ne

    //获取所有的大写字母
    String digit = CharMatcher.JAVA_UPPER_CASE.retainFrom("JiangF123Fne");
    System.out.println(digit);//JFF

    //枚举匹配字符
    String anyOf = CharMatcher.anyOf("aeiou").retainFrom("good");
    System.out.println(anyOf);//oo

    //单一字符匹配
    String isChar = CharMatcher.is('a').retainFrom("goaad");
    System.out.println(isChar);//aa

    //给定字符范围匹配
    String inRange = CharMatcher.inRange('a', 'z').retainFrom("adfc1234fg45d");
    System.out.println(inRange);//adfcfgd
}

字符集[Charsets]

@Test
public void test4() {
    String str = "中国";
    /*try {
        byte[] bytes = str.getBytes("UTF-8");
        for (byte byte1 : bytes) {
            System.out.print(byte1 + " ");
        }
    } catch (UnsupportedEncodingException e) {
        e.printStackTrace();
    }*/
    //显然第二种方法更加简便
    byte[] bytes = str.getBytes(Charsets.UTF_8);
    for (byte byte1 : bytes) {
        System.out.print(byte1 + " ");
    }
}

以上两种方法的结果是一样的,很明显,第二种方法不用处理异常,更加简便。

大小写格式[CaseFormat]

格式说明
LOWER_CAMELJava变量的命名规则,如“lowerCamel”。
LOWER_HYPHEN连字符连接变量的命名规则,如“lower-hyphen”。
LOWER_UNDERSCOREC ++变量命名规则,如“lower_underscore”。
UPPER_CAMELJava和C++类的命名规则,如“UpperCamel”。
UPPER_UNDERSCOREJava和C++常量的命名规则,如“UPPER_UNDERSCORE”。
@Test
public void test5() {
    String text = "lionel_messi";
    String text1 = "lionel-messi";
    String upperUnderscore = CaseFormat.UPPER_UNDERSCORE.to(CaseFormat.LOWER_CAMEL, "LionelMessi");//
    System.out.println(upperUnderscore);


    System.out.println(CaseFormat.LOWER_HYPHEN.to(CaseFormat.LOWER_CAMEL, text1));//lionelMessi
    System.out.println(CaseFormat.LOWER_UNDERSCORE.to(CaseFormat.LOWER_CAMEL, text));//lionelMessi
    System.out.println(CaseFormat.UPPER_UNDERSCORE.to(CaseFormat.UPPER_CAMEL, text));//LionelMessi
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值