ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

【7】java之正则表达式

2022-06-17 12:35:12  阅读:162  来源: 互联网

标签:regex 字符 java String 正则表达式 正则 str public


一、正则标记

​ 所有的正则可以使用的标记都在 java.util.regex.Pattern 类里定义。

1.1 单个字符

  • 字符:表示由一位字符所组成;
  • \\\\:表示转义字符"\\";
  • \\t:表示一个“\\t”字符;
  • \\n:匹配换行“\\n”符号;

1.2 字符集

  • [abc]:表示可能是字符a或者字符b或者字符c中的任意一位;
  • [^abc]:表示不是字符a、b、c中的任意一位(求反的意思);
  • [a-z]:所有的小写字母;
  • [a-zA-Z]:表示任意一位字母,不区分大小写;
  • [0-9]:表示任意的一位数字;

1.3 简化的(预定义的)字符集表达式

  • .:匹配除了换行符“\\n”以外的任意一个字符;
  • \\d:等价于[0-9],属于简化写法;
  • \\w:等价于[a-zA-Z_0-9],表示由任意的字母、数字 和 _ 所组成;
  • \\s:表示任意的空白字符,例如:"\\t","\\n";
  • \\D:等价于【^0-9】非数字字符,属于简化写法;
  • \\W:等价于【^a-zA-Z_0-9],表示不是由任意的字母、数字 和 _ 所组成;
  • \\S:表示任意的非空白字符;

1.4 边界匹配

不要在 Java 中使用(java 不支持),在 JavaScript 使用。

  • ^:正则的开始;
  • \$:正则的结束;

1.5 数量表达

  • 正则?:表示此正则出现0次或1次;
  • 正则+:表示此正则出现1次或1次以上;
  • 正则*:表示此正则出现0次、1次或者1次以上;
  • 正则{n}:表示此正则出现n次;
  • 正则{n,}:表示此正则出现n次以上(包含 n 次);
  • 正则{n,m}:表示此正则出现n ~ m次;

1.6 逻辑运算

  • 正则1正则2:正则1判断完成后继续判断正则2;
  • 正则1|正则2:正则1或者正则2有一组满足即可;
  • (正则):将多个正则作为1组,可以为这一组单独设置出现的次数。

二、String 类对正则的支持

​ 在 JDK 1.4之后,由于正则的引入,所以 String 类里也相应的增加了新的操作方法支持。

以下 String 类对正则支持的5个方法,要记下来。

| No. | 方法名称 | 描述 | | :--: | :--------------------------------------: | :--------------------------: | | 1 | public boolean matches(String regex) | 正则验证,使用指定的字符串判断其是否符合给出的正则表达式 | | 2 | public String replaceAll(String regex, String replacement) | 满足正则表达式的全部替换 | | 3 | public String replaceFirst(String regex, String replacement) | 替换首个 | | 4 | public String[] split(String regex) | 根据regex,将剩余的全部拆分 | | 5 | public String[] split(String regex, int limit) | 根据regex,将剩余的部分拆分 |

给出的几个方法里,替换和拆分实际难度不高,最关键的就是正则匹配,在验证上使用的特别多。

范例1:字符串替换

只保留 "wodhaghlgjl79837()@#\$%^&aRFGGH"字符串中的小写字母,并输出。

public class TestDemo {
    public static void main(String args[]){
        String str = "wodhaghlgjl79837()@#\$%^&aRFGGH";
        String regex = "[^a-z]";
        String str1 = str.replaceAll(regex,"");
        System.out.println(str1);
    }
}

范例2:字符串拆分

将以下字符串按照数字拆分 "wodhaghlgjl79837()@#\$%^&aRFG435GH",并输出。

public class TestDemo {
    public static void main(String args[]){
        String str = "wodhaghlgjl79837()@#\$%^&a87RFG435GH";
        String regex = "\\\\d+";
        String data[] = str.split(regex);
        for (int i=0;i<data.length; i++){
            System.out.println(data[i]);
        }
    }
}

范例3:验证

验证一个字符串是否是数字,如果是则将其变成 double 型。

数字可能是整数也可能是小数。

public class TestDemo {
    public static void main(String args[]){
        String str = "10.34";
        String regex = "\\\\d+((.\\\\d+)?)";
        if (str.matches(regex)){
            System.out.println(Double.parseDouble(str));
        }
    }
}

范例4:判断给定的字符串是否是一个IP地址(IPV4)

IP 地址: 192.168.1.1

public class TestDemo {
    public static void main(String args[]){
        String str = "192.187.2.42";
        String regex = "\\\\d{1,3}(\\\\.\\\\d{1,3}){3}";
        System.out.println(str.matches(regex));
    }
}

范例5:判断是否是日期格式

给定一个字符串,要求判断其是否是日期格式,如果是则将其转换为 Date 格式

public class TestDemo {
    public static void main(String args[]) throws ParseException {
        String str = "2017-1-23";
        String regex = "\\\\d{4}(-\\\\d{1,2}){2}";
        if (str.matches(regex)){
            Date date = new SimpleDateFormat("yyyy-mm-dd").parse(str);
            System.out.println(date);
        }
    }
}

范例六:判断电话号码

一般要编写电话号码,以下几种格式都是满足的:

  • 格式一:51283346(电话号码一般长度是 7 ~ 8 位);
  • 格式二:010-51283346(区号一般长度是 3 ~ 4 位);
  • 格式三:(010)-51283346
public class TestDemo {
    public static void main(String args[]){
        //- 格式一:51283346
        //- 格式二:010-51283346
        //- 格式三:(010)-51283346
        String str = "(010)-51283346";
        String regex = "((\\\\d{3,4}-)?|(\\\\(\\\\d{3,4}\\\\)-)?)\\\\d{7,8}";
            System.out.println(str.matches(regex));
    }
}

范例七:验证 email 地址

格式要求:email 由字母、数字和 _ 组成,其中开头必须是字母,结尾可以是字母或数字,用户名长度不超过30,最后的根域名只能是.com、.cn、.net、.com.cn、.net.cn、.edu、.gov、.org。

public class TestDemo {
    public static void main(String args[]){
        String str = "hdasf101234jk868954@qq.com.cn";
        String regex = "[a-zA-Z]\\\\w{0,28}[a-zA-Z0-9]@\\\\w+\\\\.(com|cn|net|com\\\\.cn|net\\\\.cn|gov|org|edu)";
            System.out.println(str.matches(regex));
    }
}

三、java.util.regex 包支持

​ 在大多数情况下使用正则的时候都会采用 String 类完成,但是正则最原始的开发包是 java.util.regex,这个包里面也提供有两个类。

范例:Pattern 类

public class TestDemo {
    public static void main(String args[]){
        String str = "hdasf101234jk868954@qq.com.cn";
        String regex = "\\\\d+";
        Pattern pattern = Pattern.compile(regex); // 编译正则
        String data[] = pattern.split(str); // 拆分字符串
        for (int i=0; i<data.length; i++){
            System.out.println(data[i]);
        }
    }
}

​ 正是因为 String 类本身就已经支持这样的操作了,所以对于 String 类而言很少会用 Pattern 与 Matcher 这两个类进行操作了。

标签:regex,字符,java,String,正则表达式,正则,str,public
来源: https://www.cnblogs.com/dangjf/p/16385308.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有