首页 > 其他分享 >正则表达式基础

正则表达式基础

时间:2023-02-06 17:07:36浏览次数:32  
标签:字符 匹配 正则表达式 Pattern 基础 matches matcher find


<span style="font-size:18px;">package cn.itcast.test;

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

public class Demo1 {

public static void main(String[] args) {
/*
//简单认识正则表达式
System.out.println("abc".matches("..."));
//.匹配字母
*/
/*p("abc".matches("..."));

//\d代表0-9的任何一个数组
//replaceAll把所有的数字替换成-
//在java中一个反斜杠(\)代表转义,
//"\\"-->输出为\ 规定\d才代表0-9的任何一个数组
//一定要注意\d在java中是\\d
p("a45678a".replaceAll("\\d","-"));


//public static Pattern compile(String regex)
//将给定的正则表达式编译到模式中。
//把regex这个正则表达式编译下,放到Pattern这个模式中,编译好了,当你再拿这个字符串匹配的时候,速度回快一些
Pattern pattern = Pattern.compile("[a-z]{3}");
//[a-z]{3}-->代表三个字母,都是a-z范围
Matcher matcher = pattern.matcher("dfg");
//pattern这个模式匹配dfg这个字符串
//matcher 匹配方法
//Matcher 匹配器
p(matcher.matches()); //匹配是否成功

//27--33行的代码执行的速度快 36行慢些 没有编译
p("dfg".matches("[a-z]{3}"));*/

/*
初步认识 . * + ?
. 一个字符
* 匹配0次或多个字符,a* 就是匹配一个或多个a,匹配串必须都是a
+ 匹配一个或多个字符
?匹配0个或一个
{}-->表示范围
[]表示某一个字符的范围
*/

/*p("aaaa".matches("a.")); // false
p("aaaa".matches("a*")); // true
p("aaaa".matches("a+")); //true
p("aaaa".matches("a?")); // false
*/
p("a".matches("."));
p("aa".matches("aa"));
p("aaaa".matches("a*"));
p("aaaa".matches("a+"));
p("".matches("a*"));
p("aaaa".matches("a?"));
p("".matches("a?"));
p("2321432456789765432".matches("\\d{3,100}"));//数字的长度在3到100之间
p("192.168.0.aaa".matches("\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}"));
p("192".matches("[0-2][0-9][0-9]"));

/*
* 范围
* []只匹配一个字符
* ^ 代表非或除了什么以外的意思
* - 范围
* | 或
* && 并
* */
p("a".matches("[abc]"));//取出中括号abc其中的一个与a进行匹配
p("a".matches("[^abc]"));//除了a,b,c以外的字符与a进行匹配
p("a".matches("[a-zA-Z]"));//所有的大小写字母与a进行匹配
p("a".matches("[a-z]|[A-Z]"));//a-z或A-Z与a进行匹配
p("a".matches("[A-Z]&&[RFG]"));

/*
* 认识\s \w \d \
*
* . 任何字符(与行结束符可能匹配也可能不匹配)
\d 数字:[0-9]
\D 非数字: [^0-9]
\s 空白字符:[ \t\n\x0B\f\r]
\S 非空白字符:[^\s]
\w 单词字符:[a-zA-Z_0-9]
\W 非单词字符:[^\w]
*/
p(" \n\r\t".matches("\\s{4}"));
p(" ".matches("\\S"));
p("a_8".matches("\\w{3}"));
p("abd888&^%".matches("[a-z]{1,3}\\d+[&^%#]+"));
p("\\".matches("\\\\"));//匹配一个反斜杠

//POSIX Style unix的统一 用的不是太多
p("a".matches("\\p{Lower}"));//英文的小写字母
// 注意\\p{Upper}或\\p{Lower}只能判断一个字符,而不是字符串

//边界匹配(boundary)
/*
^(开头) 在[]内代表非 在模式串的开头代表第一个字母是什么
$ 末尾
*/
p("hello sir".matches("^h.*"));//开头必须是h后面匹配多个0次或多个字符
p("adasdasd".matches("a.*")); //a后面匹配多个0次或多个字符
p("adasdasd".matches(".*")); //这是任意的0个或多个字符
p("adasdasd".matches("a*"));//a后面是0个或多个a flase
p("hello sir".matches(".*ir$"));
p("hello sir".matches("^h[a-z]{1,3}o\\b.*"));
p("hellosir".matches("^h[a-z]{1,3}o\\b.*"));

//空白行
p(" \n".matches("^[\\s&&[^\\n]]*\\n$"));
//第一个是空格,一个或多个,末尾是\n

//练习
p("aaa 8888c".matches(".*\\d{4}.")); //true
p("aaa 8888c".matches(".*\\b\\d{4}."));//true
p("aaa 8888c".matches(".*\\d{4}."));//true
p("aaa8888c".matches(".*\\b\\d{4}."));//false

//邮箱的匹配
p("[email protected]".matches("[a-zA-Z|[0-9]]+@[a-zA-Z|[0-9]]+.[a-zA-Z]{1,6}"));
p("[email protected]".matches("[\\w[.-]]+@[\\w[.-]]+\\.[\\w]+"));

//metches find lookingAt

/*
* Matcher类的方法:
metches 永远匹配整个字符串
find 找子串
lookingAt 每次从头上找子串

注意:
在metches与find一起用的时间,
metches在匹配的时候,如果匹配不成功,会把光标停在不匹配的哪里,你在调用find,
会接着上一次的光标进行匹配,如果你想从头开始,需要用reset方法重置一下
*/
System.out.println("---------------------");
Pattern pat = Pattern.compile("\\d{3,5}");
String s = "123-34354-123-00";
Matcher m = pat.matcher(s);
p(m.matches());//模式串与s全部进行匹配
m.reset();//注意此方法,重置匹配器
p(m.find());//模式串在s找一个子串进行匹配
p(m.start()+"-"+m.end());
p(m.find());
p(m.start()+"-"+m.end());
p(m.find());
p(m.start()+"-"+m.end());
p(m.find());
//p(m.start()+"-"+m.end());根据模式串进行匹配的时候,只有找到子串才可以使用start与end方法
System.out.println("---------------------");
p(m.lookingAt());
p(m.lookingAt());
p(m.lookingAt());


//1.字符串的替换(replacement)
Pattern p = Pattern.compile("java");//这方法区分大小写
Matcher ma= p.matcher("java Java JAVA JaVa IloveJAVA you hateJava");
while(ma.find()){
p(ma.group());//输出匹配到的子串 分组
}

//2字符串的替换(replacement) ?
Pattern p1 = Pattern.compile("java",Pattern.CASE_INSENSITIVE);//这方法区分大小写 Pattern.CASE_INSENSITIVE 启用不区分大小写的匹配。
Matcher ma1= p1.matcher("java dsfs Java JAVA JaVa IloveJAVA you hateJava dsfds");
//匹配的时候把dsfs Java看成一个串
StringBuffer buf = new StringBuffer();
int i=0;
while(ma1.find()){
i++;
if(i%2==0){
ma1.appendReplacement(buf, "java");
}else{
ma1.appendReplacement(buf, "JAVA");
}
}
ma1.appendTail(buf);
p(buf);

//1.分组 group
Pattern p2 = Pattern.compile("\\d{3,5}[a-z]{2}");
String s1 = "132aa-1235bb-132zz-00";
Matcher m1 = p2.matcher(s1);
while(m1.find()){//查找子串
p(m1.group());
}
System.out.println("----------------------------------------");
//2.分组 group
//\\d{3,5}[a-z]{2}-->这组正则表达式,用小括号,把他们分开,分成两组,再加上子串本身,共三组,
//group默认数组子串的全部
// -->(\\d{3,5})([a-z]{2})-->分组,在多个()时候,只数左小括号,按照1,2,3,4,5...进行编号,在grounp中,直接grounp(n) n代表你想调用的子串
Pattern p5 = Pattern.compile("(\\d{3,5})([a-z]{2})");
String s5 = "132aa-1235bb-132zz-00";
Matcher m5 = p5.matcher(s5);
while(m5.find()){//查找子串
p(m5.group(2));
}





}

public static void p(Object o){
System.out.println(o);
}
}
</span>


标签:字符,匹配,正则表达式,Pattern,基础,matches,matcher,find
From: https://blog.51cto.com/u_15955675/6039808

相关文章

  • NLP基础:枚举法和维特比搭建分词
    文章目录​​一.任务介绍​​​​任务描述​​​​数据集​​​​二.原理介绍​​​​最大匹配​​​​考虑语义​​​​枚举法​​​​LeetCode139单词拆分Ⅰ​​​​L......
  • NLP基础:HMM
    文章目录​​问题场景-扔不均衡硬币​​​​Q1InferenceProblem​​​​Q2估计参数的过程​​​​Q3:预测序列​​​​应用场景:词性标注Pos​​​​问题一:给定模型参数,找......
  • NLP基础-准确分词(使用工具分词)
    关于NLP相关包安装配置,可以参考:​NLP工具包安装配置​​关于分词的原理可以参考:自然语言处理NLP-隐马尔科夫)1.加载字典来保证词可以分准对一些专业的名词来说,使用原有的词......
  • NLP基础-词性标注应用去除停用词
    词性标注-去除停用词词性标注就是对分词后的词性进行标识,通常分词后其词性也就直接输出了,而词性标注的应用就是可以通过词性来进行过滤(去除助词停用词等),从而得到更有效的......
  • NLP基础-命名实体识别(一)基于规则
    命名实体识别命名实体识别(NamedEntityRecognition,简称NER)与自动分词,词性标注一样,命名实体识别也是自然语言处理中的一个基础任务,其目的是识别语料中的人名、地名、组织机......
  • 计算机多媒体应用基础
    计算机基础(03)多媒体应用基础3多媒体应用基础3.1多媒体技术概述3.1.1多媒体基础概念@1媒体与多媒体:从一般意义上讲,在计算机或通讯领域,媒体是指信息的载体或者信息的......
  • 技术工作中怎么去提高基础
    技术工作中怎么去提高基础公众号:diting_dapeng,关注我领取更多学习资料做技术,我们经常听到的一句话是:基础很重要,一定要打好基础啊。我们都知道基础很重要,那么对于我们来说,什......
  • RT-Thread stm32 基础记录
    准备工作安装RT-ThreadStudio。新建Nano工程打开IDE,点击【文件】-【新建】-【RT-Thread项目】:进入新建工程的配置向导:注:可以通过修改board.c的 ​​SystemClock_Co......
  • 软件测试基础(一)
    一.测试相关概念IT:InformationTechnology,即信息科技和产业的意思。软件:一系列按照特定顺序组织的计算机数据和指令的集合,程序+数据+文件。产品:能够供给市场,被人们使用......
  • 《区块链基础知识25讲》-第九讲-记录所有权
    把交易历史记录作为当前所有权的证明依据。需要:找到一份不仅是声称某人是某物所有者的账本记录,而且还提供所有权的证据文件,从而作为所有权的证明。每一次所有权的交易通过交......