首页 > 其他分享 >正则表达式(Regular Expression)详解

正则表达式(Regular Expression)详解

时间:2023-03-19 12:22:58浏览次数:53  
标签:字符 replaceAll 匹配 String 正则表达式 Regular Expression public 详解

1 前言

正则表达式主要用于复杂文本处理,如模式匹配、格式检验、文本替换等。常用的通配符有:

^, $, *, ., , -, +, ?, &, |, (), [], {}

2 String中的split()、matches()、replace()、replaceFirst()、replaceAll()方法

1. split() 方法

public String[] split(String regex) //字符串替换(支持正则表达式)

2. matches()方法

public boolean matches(String regex) //匹配模式串(支持正则表达式)

3. replace()方法

public String replace(char oldChar, char newChar) //替换所有匹配的字符
public String replace(CharSequence target, CharSequence replacement) //替换所有匹配的字符串

不支持正则表达式匹配 ,替换后不改变原串的值,返回一个新的串

4. replaceFirst()方法

public String replaceFirst(String regex, String replacement) //替换第一次匹配的字符串(支持正则表达式)

5. replaceAll()方法

public String replaceAll(String regex, String replacement) //替换所有匹配的字符串(支持正则表达式)

6. replace()方法与replaceAll()方法比较

String s1="12***ab*";
String s2=s1.replace("*","_");
String s3=s1.replaceAll("\\*", "_");
s1: 12***ab*
S2: 12___ab_
s3: 12___ab_

2 正则表达式基本类型

2.1 标准字符集

  • \d:任意一个数字(0-9)
  • \w:任意一个字母(A-Z,a-z)、数字(0-9)、下划线(_)
  • \s:空格、制表符(\t)、换行符(\n)中任意一个
  • .:任意字符(除 "\n"),如果要匹配包含 "\n" 在内的所有字符,一般使用 [\s\S]

注意区分大小写,大写表示取反,如:\D表示任意非数字字符

2.2 自定义字符集

[ab5@]:匹配 "a" 或 "b" 或 "5" 或 "@"
[^abc]:匹配 "a"、"b"、"c" 之外的任意字符
[f-k]:匹配 f - k 之间的任意字母
[^a-f0-3]:匹配 a - f, 0 - 3 之外的任意字符
[\d.\-+]:匹配 "0" - "9"、"."、"-"、"+"

注意:

  • 除 "^"、"-"、"" 外的特殊符号,如果被包含在 "[ ]" 中,将失去其特殊意义,当做普通字符处理;
  • 除 "." 以外的标准字符集,如果被包含在 "[ ]" 中,自定义字符集将包含该标准字符集。

2.3 量词

  • {n}:表达式重复 n 次
  • {m,n}:表达式至少重复 m 次,至多重复 n 次
  • {m,}:表达式至少重复 m 次
  • ?:表达式重复0次或1次,相当于
  • +:表达式至少出现一次,相当于
  • *:表达式不出现或出现任意次,相当于
\d{3}:匹配3位整数,相当于"\d\d\d"
\d\d{3}:匹配4位整数
(\d\d){3}:匹配6位整数
a\d?b:匹配 "ab", "a0b", "a5b", "a7b"等

2.4 字符边界

  • ^:与字符串开始的地方匹配
  • $:与字符串结束的地方匹配
  • \b:匹配一个单词边界(匹配一个位置:前面的字符和后面的字符不全是\w)

2.5 选择与分组

  • |:a|b,匹配 a 或 b
  • ():用于将多个字符作为一个整体

2.6 预搜索(零宽断言)

  • (?=exp):断言自身出现的位置后面能匹配表达式 exp
  • (?<=exp):断言自身出现的位置前面能匹配表达式 exp
  • (?!exp):断言自身出现的位置后面不能匹配表达式 exp
  • (?<!exp):断言自身出现的位置前面不能匹配表达式 exp

注意:只进行表达式的匹配,匹配内容不计入最终的匹配结果,是零宽度。

待测串:having eating going singsing
模式串:[a-z]+(?=ing)
匹配串:hav eat go s

3 简单案例

问题描述:给一个字符串 s ,删除字母、数字、减号之外的字符,删除连续两个及以上的减号,删除孤立的减号,使得每个单词仍保持原来的意义。如 " -i- -- am- @__#$ 19-years - -old_ _ _ " ,经处理后,得到 "i am 19-years old".

import java.util.Scanner;
public class Main {
	public static void main(String[] args) {
		Scanner sc=new Scanner(System.in);
		String s=sc.nextLine();
		s=s.replaceAll("[^a-zA-Z0-9\\-]"," "); //替换所有非字母、数字、减号字符为空格
		s=s.replaceAll("\\-{2,}", " "); //替换连续2个及以上的减号为空格
		s=s.replace("- ", " "); //替换"- "为空格
		s=s.replace(" -", " "); //替换" -"为空格
		s=s.replaceAll("\\s+"," "); //替换连续1个及以上的空字符(空格、\t、\n)为空格
		s=s.trim(); //删除首尾多余的空格
		if(s.charAt(0)=='-') {
			s=s.replaceFirst("-",""); //删除字符串头的"-"
		}
		System.out.println(s);
	}
}
   -i-  -- am- @ 	 __#$ 19-years - -old_			
i am 19-years old

​ 声明:本文转自正则表达式(Regular Expression)详解

标签:字符,replaceAll,匹配,String,正则表达式,Regular,Expression,public,详解
From: https://www.cnblogs.com/zhyan8/p/17232802.html

相关文章

  • Java线程池详解
    1使用线程池的好处降低资源消耗:通过重复利用已创建的线程降低线程创建和销毁造成的消耗;提高响应速度:当任务到达时,任务可以不需要等到线程创建就能立即执行;提高线程的......
  • JVM详解
    1JVM运行机制概述JVM运行机制类加载机制:类加载过程由类加载器来完成,即由ClassLoader及其子类实现,有隐式加载和显式加载两种方式。隐式加载是指在使用new等方式创建对......
  • etcd详解
    etcd原理详解etcd概述etcd的特点etcd是一个Go言编写的分布式、高可用的一致性键值存储系统,用于提供可靠的分布式键值存储、配置共享和服务发现等功能etcd具有以下特点:......
  • Android自动化测试框架uiautomator2详解
    1uiautomator2简介​uiautomator2是一种Android自动化测试框架,提供了点击、长按、输入文本、滑动、拖拽、截屏等方法,能够模拟用户的各种动作。用户可以通过控件......
  • tensorflow中交叉熵损失函数详解
    1前言tensorflow中定义了3个交叉熵损失函数:softmax_cross_entropy_with_logits(logits,labels)softmax_cross_entropy_with_logits_v2(logits,labels)sparse_softm......
  • java学习日记20230318-object类详解
    objectClass Object是类Object结构的根。 每个班都有Object作为超类。 所有对象(包括数组)都实现了这个类的方法。equals==和equals的区别==比较运算符,既可以......
  • 关系范式详解
    1前言关系模式规范化过程函数依赖:若Y=f(X),则称X函数决定Y,或Y函数依赖于X,记为:X->Y。在数据库中,通常将X置为关键字,将Y置为非主属性。2范式2.11NF1NF定义:关系的所......
  • Linux 远程数据同步工具详解(rsync)
    一、简介1认识Rsync(remotesynchronize)是一个远程数据同步工具,可通过LAN/WAN快速同步多台主机间的文件。Rsync使用所谓的“Rsync算法”来使本地和远程两个主机之间的文......
  • 树剖详解+习题
    主要思想树链剖分(简称树剖)的思想在于将一棵树剖分为若干条链,从而转化为一个线性序列并使用数据结构维护来解决问题。以下主要讲两种:一种是重链剖分,一种是长链剖分。重链......
  • JavaScript 数据类型详解
    原文链接:​   ​​https://note.noxussj.top/?source=51cto​​常见的ES5数据类型分为基本数据类型、引用数据类型两种。包含字符串、数字、对象、数组、函数、布尔值......