java正则表达式

Java正则表达式主要运用之一是为了快速代替、验证字符串。
字符串代替:

import java.io.*;
import java.util.regex.*;
class test  
{
    public static void main (String[] args) throws java.lang.Exception
    {
        String d="abc123b34b5135b2341235ijl34";
        String p="[a-zA-Z]+";
        System.out.println(d.replaceAll(p,""));//方法1,去除字符串d中全部字母

        Pattern pattern = Pattern.compile(p);
        Matcher m = pattern.matcher(d);
        System.out.println(m.replaceAll(""));//方法2
    }
}

字符串验证:

import java.io.*;
import java.util.regex.*;
class test  
{
    public static void main (String[] args) throws java.lang.Exception
    {
        String data[]={"123@qq.com","@q.com","dsaf@.com","afd23@sdgf.com","adsf@asdgf"};
        String p="\\w+@\\w+\\.com";//正则表达式

        //验证字符串
        for(String d:data){
            if(d.matches(p)) System.out.println(d+" 符合电子邮箱格式");//方法1
        }

        for(String d:data){
            if(Pattern.matches(p,d))  System.out.println(d+" 符合电子邮箱格式");//方法2
        }

        Pattern pattern=Pattern.compile(p);
        for(String d:data){
            Matcher m=pattern.matcher(d);
            if(m.find()) System.out.println(d+" 符合电子邮箱格式");//方法3
        }


    }
}

Java正则表达式——分组与捕获
如果我们要对多个字符进行重复怎么办呢?此时我们就要用到分组,我们可以使用小括号”()”来指定要重复的子表达式,然后对这个子表达式进行重复,例如:(abc)? 表示0个或1个abc 这里一个括号的表达式就表示一个分组。 分组可以分为两种形式,捕获组和非捕获组。
捕获组
捕获组可以通过从左到右计算其开括号来编号。例如,在表达式 ((A)(B(C))) 中,存在四个这样的组:
1 ((A)(B(C)))
2 (A )
3 (B(C))
4 (C)
组零始终代表整个表达式之所以这样命名捕获组是因为在匹配中,保存了与这些组匹配的输入序列的每个子序列。捕获的子序列稍后可以通过 Back 引用在表达式中使用,也可以在匹配操作完成后从匹配器检索。

Back 引用是说在后面的表达式中我们可以使用组的编号来引用前面的表达式所捕获到的文本序列(是文本不是正则)。
例如 ([” ‘]).* \1 其中使用了分组,\1就是对引号这个分组的引用,它匹配包含在两个引号或者两个单引号中的所有字符串,如,”abc” 或 ” ’ ” 或 ’ ” ’ ,但是请注意,它并不会对” a’或者 ‘a”匹配。原因上面已经说明,Back引用只是引用文本而不是表达式。

非捕获组
以 (?) 开头的组是纯的非捕获 组,它不捕获文本,也不针对组合计进行计数。就是说,如果小括号中以?号开头,那么这个分组就不会捕获文本,当然也不会有组的编号,因此也不存在Back 引用。

在Java中,支持的非捕获组,有如下几种:

(?=X) X,通过零宽度的正 lookahead
(?!X) X,通过零宽度的负 lookahead
(?<=X) X,通过零宽度的正 lookbehind

这四个非捕获组用于匹配表达式X,但是不包含表达式的文本。
(?=X ) 零宽度正先行断言。仅当子表达式 X 在此位置的右侧匹配时才继续匹配。例如,\w+(?=\d) 与后跟数字的单词匹配,而不与该数字匹配。此构造不会回溯。
(?!X)零宽度负先行断言。仅当子表达式 X 不在此位置的右侧匹配时才继续匹配。例如,例如,\w+(?!\d) 与后不跟数字的单词匹配,而不与该数字匹配。
(?<=X)零宽度正后发断言。仅当子表达式 X 在此位置的左侧匹配时才继续匹配。例如,(?<=19)99 与跟在 19 后面的 99 的实例匹配。此构造不会回溯。
(?< !X)零宽度负后发断言。仅当子表达式 X 不在此位置的左侧匹配时才继续匹配。例如,(?< !19)99 与不跟在 19 后面的 99 的实例匹配

举例:
1、测试匹配性 (?< !4)56(?=9) 这里的含义就是匹配后面的文本56前面不能是4,后面必须是9组成。因此,可以匹配如下文本 5569 ,与4569不匹配。
2 、提取字符串 提取 da12bka3434bdca4343bdca234bm 提取包含在字符a和b之间的数字,但是这个a之前的字符不能是c,b后面的字符必须是d才能提取。

import java.io.*;
import java.util.regex.*;
class test  
{
    public static void main (String[] args) throws java.lang.Exception
    {
        String data="da12bka3434bdca4343bdca234bm";
        Pattern p=Pattern.compile("(?<!c)a(\\d+)bd");
        Matcher m=p.matcher(data);
        while(m.find()){
            System.out.println("整个表达式:"+m.group(0)+" 组一:"+m.group(1));
        }
        Pattern p2=Pattern.compile("[^c]a(\\d+)bd");
        Matcher m2=p2.matcher(data);
        while(m2.find()){
            System.out.println("整个表达式:"+m2.group(0)+" 组一:"+m2.group(1));
        }

    }
}

结果:
整个表达式:a3434bd 组一:3434(并没有把k输出)
整个表达式:ka3434bd 组一:3434

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值