JAVA中字符串判断、提取数字方法汇总

一、判断一个字符串是否都为数字

(1)java类提供的方法

package com.gec.lalala;

public class DigitTest {

    public static void main(String[] args) {
        String strNum = "yellow1red2green3-lalala88lololo66";
        boolean numbers = isDigit(strNum);
        System.out.println(numbers);
    }

    // 判断一个字符串是否都为数字
    private static boolean isDigit(String strNum) {
        if (strNum != null && !"".equals(strNum)) {
            for (int i = 0; i < strNum.length(); i++) {
                // ASCALL码中48-57代表0-9
                if (!(strNum.charAt(i) >= 48) || !(strNum.charAt(i) <= 57)) {
                    return false;// 只要有一个不是0-9就返回false
                }
            }
        }
        return true;
    }

}

(2)用正则表达式

package com.gec.lalala;

import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class DigitTest {

    public static void main(String[] args) {
        String strNum = "yellow1red2green3-lalala88lololo66";
        boolean numbers = isDigit1(strNum);
        System.out.println(numbers);
    }

     // 判断一个字符串是否都为数字
    private static boolean isDigit1(String strNum) {
        return strNum.matches("[0-9]+");
    }

    // 判断一个字符串是否都为数字
    private static boolean isDigit2(String strNum) {
        Pattern pattern = Pattern.compile("[0-9]+");
        Matcher matcher = pattern.matcher(strNum);
        return matcher.matches();
    }

}

二、提取字符串中的数字

(1)java类提供的方法

package com.gec.lalala;

public class DigitTest {

    public static void main(String[] args) {
        String strNum = "yellow1red2green3-lalala88lololo66";
        String numbers = getDigit(strNum);
        System.out.println(numbers);
    }

    // String 类提供截取数字的方法
    private static String getDigit(String strNum) {
        String result = "";
        if (strNum != null && !"".equals(strNum)) {
            for (int i = 0; i < strNum.length(); i++) {
                if (strNum.charAt(i) >= 48 && strNum.charAt(i) <= 57) {
                    result = result + strNum.charAt(i) + ",";
                }
            }
        }
        //-------------字符串截取的几种方法--------------
        // StringBuffer buffer = new StringBuffer(result);
        // (1)buffer = buffer.deleteCharAt(buffer.length()-1);
        // (2)buffer = buffer.replace(buffer.length()-1, buffer.length(),"");
        //  //return buffer.toString();
        // (3)result = buffer.substring(0, result.length() - 1);这个返回的结果是String类型
        result = result.substring(0, result.length() - 1);// 去掉最后一个逗号
        return result;
    }
  
}

(2)用正则表达式

package com.gec.lalala;

import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class DigitTest {

    public static void main(String[] args) {
        String strNum = "yellow1red2green3-lalala88lololo66";
        String numbers = getNumbers(strNum);
        System.out.println(numbers);
    }

    // 截取数字
    private static String getNumbers(String content) {
        Pattern pattern = Pattern.compile("\\d+");// Pattern.compile("\\D+");//
                                                  // 截取非数字
        Matcher matcher = pattern.matcher(content);
        String result = "";
        while (matcher.find()) {
            result = result + matcher.group(0) + ",";
        }
        result = result.replaceAll("\\,$", "");// 去掉最后一个逗号
        return result;
    }
}

三、我思故我在

    在最后出现了点问题:matcher.group(0) 是什么意思?0 和 1 的区别是什么?为什么换成 matcher.group(1) 后得出的结果是相同的?

解析:正则表达式matcher.group用法

首先学习几个重要的概念

  • 子表达式

在正则匹配模式中,使用一对括号括起来的内容是一个子表式

  • 捕获

在正则匹配模式中,子表达式匹配到的内容会被系统捕获至系统的缓冲区中

  • 反向引用(后向引用)

捕获之后,可以在匹配模式中,使用\n (n:数字)来引用系统的第n号缓冲区内容 
这里写图片描述

    下面两个概念先不管,认识了子表达式,group方法就好理解了。group(…)是针对子表达式来说的,其中的数字是代表子表达式的索引,group(0)就是指的整个表达式,group(1) 指的是第一个子表达式里的东西,group(2)指的第二个子表达式里的东西。

代码示例:

package com.gec.lalala;

import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class DigitTest {

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        String str = "Hello,World! la!la!la!";
        Pattern pattern = Pattern.compile("W(or)(ld!)");
        Matcher matcher = pattern.matcher(str);
        while (matcher.find()) {
            System.out.println("Group_0: " + matcher.group(0));// 得到第0组——整个匹配
            System.out.println("Group_1:" + matcher.group(1));// 得到第一组匹配——与(or)匹配的
            System.out.println("Group_2:" + matcher.group(2));// 得到第二组匹配——与(ld!)匹配的,组也就是子表达式
            System.out.println("Start_0:" + matcher.start(0) + " End 0:" + matcher.end(0));// 总匹配的索引
            System.out.println("Start_1:" + matcher.start(1) + " End 1:" + matcher.end(1));// 第一组匹配的索引
            System.out.println("Start_2:" + matcher.start(2) + " End 2:" + matcher.end(2));// 第二组匹配的索引
            System.out.println(str.substring(matcher.start(0), matcher.end(1)));// 从总匹配开始索引到第1组匹配的结束索引之间子串——Wor
            System.out.println(str.substring(matcher.start(0), matcher.end(2)));// 从总匹配开始索引到第2组匹配的结束索引之间子串——World!
        }
    }
}

运行结果:

Group_0: World!
Group_1: or
Group_2: ld!
Start_0: 6 End 0:12
Start_1: 7 End 1:9
Start_2: 9 End 2:12
Wor
World!

最后感谢以下文章提供的学习帮助

https://www.iteye.com/blog/winter8-1463244

https://blog.csdn.net/ethan_10/article/details/80509767

发布了81 篇原创文章 · 获赞 9 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/Alone_in_/article/details/104693020
今日推荐