Java正则表达式基础

简介: Java正则表达式基础

(一)正则表达式是什么,用来干什么:


正则表达式(regularexpression,简写为regex)是一个字符串,用来描述匹配一个字符申集合的模式。对于字符串处理来说,正则表达式是一个强大的工具。


可以使用正则表达式来匹配、替换和拆分字符串。在生活中我们经常会需要编写代码来验证用户输入,比如验证输入是否是一个数字,是否是一个全部小写的字符串,或者社会安全号。这时我们可以使用正则表达式来完成这个任务。在网络安全上,正则表达式常被用作过滤用户输入,防止用户输入恶意代码等,起到防护作用。(如今已经不常见了)


(二)前置知识:


使用正则表达式需要引入 java.util.regex.* 包(其实正常直接import java.util.*  个人觉得省事),包里包含了三个类Pattern 类、Matcher 类、PatternSyntaxException。


在 Java 中,\\表示:我要插入一个正则表达式的反斜线,所以其后的字符具有特殊的意义。而在其他语言中,\\表示:我想要在正则表达式中插入一个普通的(字面上的)反斜杠,请不要给它任何特殊的意义。


\:将下一字符标记为特殊字符、文本、反向引用或八进制转义符。例如, n匹配字符 n。\n 匹配换行符。序列 \\\\ 匹配 \\ ,\\( 匹配 (。


^:匹配输入字符串开始的位置。如果设置了 RegExp 对象的 Multiline 属性,^ 还会与"\n"或"\r"之后的位置匹配。


$:匹配输入字符串结尾的位置。如果设置了 RegExp 对象的 Multiline 属性,$ 还会与"\n"或"\r"之前的位置匹配。


注意:


^:只有当它出现在一个字符集合里(被放在[和]之间)并紧跟在左方括号[的后面时,它才能发挥“求非”作用。如果是在一个字符集合的外面并位于一个模式的开头,^将匹配字符串的开头。


例如:[^abc]: 表示不是a,b,c中的任意一个;


(三)常用方法:


①匹配


String.matches() 这个方法主要是返回是否匹配指定的字符串,如果匹配则为 true,反之为 false。


matches方法很类似equa1s方法。然而,matches方法功能更加强大。它不仅可以匹配一个固定的字符串,还可以匹配符合一个模式的字符串集。


②分割


String[] split(String regex)

743e9171e5c5f229903377c5e24c3f82.png


③替换

replaceFirst()和replaceAll()方法都用来替换匹配给定正则表达式的文本。

正如其名称所示,replaceFirst()替换第一个匹配项,replaceAll()替换所有匹配项。

(四)语法:


①字符的取值范围


[abc] : 表示可能是a,可能是b,也可能是c。


[^abc]: 表示不是a,b,c中的任意一个


[a-zA-Z]: 表示是英文字母


[0-9]:表示是数字


②字符表示


.:匹配任意的字符,除了换行符。


\d:表示数字


\D:表示非数字


\s:表示由空格组成,[ \t\n\r\x\f]


\S:表示由非空字符组成,[^\s]


\w:表示字母、数字、下划线,[a-zA-Z0-9_]


\W:表示不是由字母、数字、下划线组成


\b:匹配一个字边界,即字与空格间的位置。例如,"er\b"匹配"never"中的"er",但不匹配"verb"中的"er"。


\B:非字边界匹配。"er\B"匹配"verb"中的"er",但不匹配"never"中的"er"。


③数量表达式


?: 表示出现0次或1次,同下+和*,跟在字母或者.点号后面。


+: 表示出现1次或多次


*: 表示出现0次、1次或多次


{n}:表示出现n次


{n,m}:表示出现n~m次


{n,}:表示出现n次或n次以上


贪心与非贪心:


?:当此字符紧随任何其他限定符(*、+、?、{n}、{n,}、{n,m})之后时,匹配模式是"非贪心的"。"非贪心的"模式匹配搜索到的、尽可能短的字符串,而默认的"贪心的"模式匹配搜索到的、尽可能长的字符串。例如,在字符串"oooo"中,"o+?"只匹配单个"o",而"o+"匹配所有"o"。


注意:*, +, {n,}都是常用的贪婪型元字符,在匹配时它们会尽可能地从一段文本的开头一直匹配到这段文本的末尾,而不是从这段文本的开头匹配到碰到第一个匹配时为止。


④逻辑表达式


XY: 表示X后面跟着Y,这里X和Y分别是正则表达式的一部分


X|Y:表示X或Y,比如"food|f"匹配的是foo(d或f),而"(food)|f"匹配的是food或f


(X):子表达式,将X看做是一个整体


表如下:


(五)实例:


①校验数字的表达式


数字:^[0-9]*$


n位的数字:^\d{n}$


至少n位的数字:^\d{n,}$


m-n位的数字:^\d{m,n}$


零和非零开头的数字:^(0|[1-9][0-9]*)$


非零开头的最多带两位小数的数字:^([1-9][0-9]*)+(\.[0-9]{1,2})?$


带1-2位小数的正数或负数:^(\-)?\d+(\.\d{1,2})$


正数、负数、和小数:^(\-|\+)?\d+(\.\d+)?$


有两位小数的正实数:^[0-9]+(\.[0-9]{2})?$


有1~3位小数的正实数:^[0-9]+(\.[0-9]{1,3})?$


非零的正整数:^[1-9]\d*$ 或 ^([1-9][0-9]*){1,3}$ 或 ^\+?[1-9][0-9]*$


非零的负整数:^\-[1-9][]0-9"*$ 或 ^-[1-9]\d*$


非负整数:^\d+$ 或 ^[1-9]\d*|0$


非正整数:^-[1-9]\d*|0$ 或 ^((-\d+)|(0+))$


非负浮点数:^\d+(\.\d+)?$ 或 ^[1-9]\d*\.\d*|0\.\d*[1-9]\d*|0?\.0+|0$


非正浮点数:^((-\d+(\.\d+)?)|(0+(\.0+)?))$ 或 ^(-([1-9]\d*\.\d*|0\.\d*[1-9]\d*))|0?\.0+|0$


正浮点数:^[1-9]\d*\.\d*|0\.\d*[1-9]\d*$ 或 ^(([0-9]+\.[0-9]*[1-9][0-9]*)|([0-9]*[1-9][0-9]*\.[0-9]+)|([0-9]*[1-9][0-9]*))$


负浮点数:^-([1-9]\d*\.\d*|0\.\d*[1-9]\d*)$ 或 ^(-(([0-9]+\.[0-9]*[1-9][0-9]*)|([0-9]*[1-9][0-9]*\.[0-9]+)|([0-9]*[1-9][0-9]*)))$


浮点数:^(-?\d+)(\.\d+)?$ 或 ^-?([1-9]\d*\.\d*|0\.\d*[1-9]\d*|0?\.0+|0)$


②校验字符的表达式


汉字:^[\u4e00-\u9fa5]{0,}$    //涉及到编码了


英文和数字:^[A-Za-z0-9]+$


长度为3-20的所有字符:^.{3,20}$


由26个英文字母组成的字符串:^[A-Za-z]+$


由26个大写英文字母组成的字符串:^[A-Z]+$


由26个小写英文字母组成的字符串:^[a-z]+$


由数字和26个英文字母组成的字符串:^[A-Za-z0-9]+$


由数字、26个英文字母或者下划线组成的字符串:^\w+$ 或 ^\w{3,20}$


中文、英文、数字包括下划线:^[\u4E00-\u9FA5A-Za-z0-9_]+$


中文、英文、数字但不包括下划线等符号:^[\u4E00-\u9FA5A-Za-z0-9]+$ 或 ^[\u4E00-\u9FA5A-Za-z0-9]{2,20}$


可以输入含有^%&',;=?$\"等字符:[^%&',;=?$\x22]+


禁止输入含有~的字符:[^~\x22]+


③真实实例


Email地址:^\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*$


域名:[a-zA-Z0-9][-a-zA-Z0-9]{0,62}(\.[a-zA-Z0-9][-a-zA-Z0-9]{0,62})+\.?


InternetURL:[a-zA-z]+://[^\s]* 或 ^http://([\w-]+\.)+[\w-]+(/[\w-./?%&=]*)?$


手机号码:^(13[0-9]|14[5|7]|15[0|1|2|3|4|5|6|7|8|9]|18[0|1|2|3|5|6|7|8|9])\d{8}$


电话号码:^(\(\d{3,4}-)|\d{3.4}-)?\d{7,8}$


国内电话号码:\d{3}-\d{8}|\d{4}-\d{7}


身份证号(15位、18位数字),最后一位是校验位,可能为数字或字符X:(^\d{15}$)|(^\d{18}$)|(^\d{17}(\d|X|x)$)


帐号是否合法(字母开头,允许5-16字节,允许字母数字下划线):^[a-zA-Z][a-zA-Z0-9_]{4,15}$


密码(以字母开头,长度在6~18之间,只能包含字母、数字和下划线):^[a-zA-Z]\w{5,17}$


强密码(必须包含大小写字母和数字的组合,不能使用特殊字符,长度在 8-10 之间):^(?=.*\d)(?=.*[a-z])(?=.*[A-Z])[a-zA-Z0-9]{8,10}$


强密码(必须包含大小写字母和数字的组合,可以使用特殊字符,长度在8-10之间):^(?=.*\d)(?=.*[a-z])(?=.*[A-Z]).{8,10}$


日期格式:^\d{4}-\d{1,2}-\d{1,2}


一年的12个月(01~09和1~12):^(0?[1-9]|1[0-2])$


一个月的31天(01~09和1~31):^((0?[1-9])|((1|2)[0-9])|30|31)$


xml文件:^([a-zA-Z]+-?)+[a-zA-Z0-9]+\\.[x|X][m|M][l|L]$


中文字符的正则表达式:[\u4e00-\u9fa5]


双字节字符:[^\x00-\xff] (包括汉字在内,可以用来计算字符串的长度(一个双字节字符长度计2,ASCII字符计1))


空白行的正则表达式:\n\s*\r (可以用来删除空白行)


HTML标记的正则表达式:<(\S*?)[^>]*>.*?|<.*? /> ( 首尾空白字符的正则表达式:^\s*|\s*$或(^\s*)|(\s*$) (可以用来删除行首行尾的空白字符(包括空格、制表符、换页符等等),非常有用的表达式)


腾讯QQ号:[1-9][0-9]{4,} (腾讯QQ号从10000开始)


中国邮政编码:[1-9]\d{5}(?!\d) (中国邮政编码为6位数字)


IP地址:((?:(?:25[0-5]|2[0-4]\\d|[01]?\\d?\\d)\\.){3}(?:25[0-5]|2[0-4]\\d|[01]?\\d?\\d))

目录
相关文章
|
10天前
|
Java 数据库
案例一:去掉数据库某列中的所有英文,利用java正则表达式去做,核心:去掉字符串中的英文
这篇文章介绍了如何使用Java正则表达式从数据库某列中去除所有英文字符。
28 15
|
6天前
|
Java 程序员 API
Java中的Lambda表达式:简化代码的秘密武器
【10月更文挑战第11天】 在Java编程中,Lambda表达式是一种简洁而强大的工具,它允许我们将函数作为参数传递给其他方法。本文将介绍Lambda表达式的基本概念、使用方法以及在实际项目中的应用案例,帮助你更好地理解和利用这一特性来简化代码。
20 8
|
9天前
|
并行计算 Java API
Java中的Lambda表达式及其应用
本文将深入探讨Java中的Lambda表达式,从基本概念到实际应用。我们将了解Lambda表达式的定义、优势和使用场景,并通过实例展示其在Java编程中的强大功能。无论是初学者还是经验丰富的开发者,都可以从中获得有价值的见解。
|
14天前
|
IDE Java 测试技术
Java“非法的表达式开头"是什么原因引起的,怎么解决
“非法的表达式开头”通常是由于在Java代码中错误地放置了表达式或语法错误导致的。例如,在应该是一个语句的地方写了一个表达式,或者在表达式内部出现了不正确的结构。解决方法是检查并修正相关语法错误,确保表达式的正确性和位置适当性。检查括号是否配对完整,以及变量声明、运算符使用是否符合规范也是必要的步骤。
|
14天前
|
IDE Java 开发工具
Java“未封闭的 String 表达式”怎么解决
要解决Java中的“未封闭的 String 表示”问题,需检查并修正字符串字面量,确保每个字符串被正确地用双引号括起来。若字符串跨越多行,可使用字符串连接操作符(+)或引入文本块(JDK 13 及以上版本)。这能帮助避免语法错误,并使代码更整洁易读。
|
12天前
|
并行计算 Java API
探索Java中的Lambda表达式:简化代码,提高可读性
【10月更文挑战第5天】Lambda表达式在Java 8中引入,旨在简化集合操作和并行计算。本文通过介绍Lambda表达式的基本概念、语法结构以及实际应用示例,展示了如何利用这一特性编写更加简洁、易读的代码。我们将从Lambda的基础入手,逐步深入到其在函数式接口中的应用,并探讨其对Java编程范式的影响。
|
12天前
|
Java
探索Java中的Lambda表达式
【10月更文挑战第5天】Lambda表达式是Java 8引入的一个新特性,它允许我们将功能作为方法参数,或者代码作为数据进行处理。这种表达式提供了一种简洁的表示匿名函数的方式,使得代码更加简洁易读。本文将深入探讨Lambda表达式的基本概念,使用方法,以及如何在Java程序中有效地应用它们。
11 1
|
22天前
|
Java 数据处理 开发者
Java中的Lambda表达式:简化你的代码之路
【8月更文挑战第66天】Lambda表达式在Java 8中首次引入,它为Java开发者提供了一种更简洁、更灵活的编程方式。本文将通过简单易懂的语言和实际代码示例,引导你理解Lambda表达式的基本概念、语法结构以及如何在Java项目中应用它来简化代码。无论你是Java新手还是有经验的开发者,这篇文章都将帮助你更好地掌握这一强大的工具。
42 11
|
22天前
|
Java API
Java中的Lambda表达式:一种简洁而强大的编程工具
本文将深入探讨Java中的Lambda表达式,它是一种简洁而强大的编程工具。通过本文,您将了解Lambda表达式的基本概念、语法结构以及使用方法。我们还将介绍Lambda表达式的应用场景和最佳实践,并通过实例演示其在简化代码、提高可读性和编写并行代码方面的优势。最后,我们将讨论使用Lambda表达式时需要注意的一些事项和限制。无论您是初学者还是有经验的Java开发人员,都可以从本文中获得有价值的知识和技能。现在,让我们一起探索Java中Lambda表达式的奇妙世界吧!
|
28天前
|
Java
探索Java中的Lambda表达式
【9月更文挑战第28天】Lambda表达式,这一Java 8引入的轻量级语法结构,为函数式编程提供了强有力的支持。它简化了代码,提高了开发效率,并使得并行处理数据变得异常容易。本文将通过直观的例子和详细的解释,带领读者深入理解Lambda表达式的奥秘,从而在编程实践中更加灵活地运用它们。