首先说一下java正则表达式的重点概念:
第一、相关类:Pattern、Matcher
第二、典型的调用顺序是
Pattern p = Pattern.compile("a*b");
Matcher m = p.matcher("aaaaab");
boolean b = m.matches();
在仅使用一次正则表达式时,可以方便地通过此类定义 matches 方法。此方法编译表达式并在单个调用中将输入序列与其匹配。
语句 boolean b = Pattern.matches("a*b", "aaaaab");等效于上面的三个语句,尽管对于重复的匹配而言它效率不高,因为它不允许重用已编译的模式。
此类的实例是不可变的,可供多个并发线程安全使用。Matcher 类的实例用于此目的则不安全。
第三、正则表达式的构造摘要
字符类
[abc] a、b 或 c(简单类)
[^abc] 任何字符,除了 a、b 或 c(否定)
[a-zA-Z] a 到 z 或 A 到 Z,两头的字母包括在内(范围)
[a-d[m-p]] a 到 d 或 m 到 p:[a-dm-p](并集)
[a-z&&[def]] d、e 或 f(交集)
[a-z&&[^bc]] a 到 z,除了 b 和 c:[ad-z](减去)
[a-z&&[^m-p]] a 到 z,而非 m 到 p:[a-lq-z](减去)
说明:
[]表示范围--某一个字符的范围
^表示非
&&表示
预定义字符类
. 任何字符(与行结束符可能匹配也可能不匹配)
\d 数字:[0-9]
\D 非数字: [^0-9]
\s 空白字符:[ \t\n\x0B\f\r]
\S 非空白字符:[^\s]
\w 单词字符:[a-zA-Z_0-9]
\W 非单词字符:[^\w]
说明:预定义字符类和字符类部分可以互换。如:[0-9] == \d
数量词
X? :X出现一次或一次也没有
X* :X出现零次或多次
X+ :X出现一次或多次
X{n} :X出现恰好 n 次
X{n,} :X出现至少 n 次
X{n,m} :X出现至少 n 次,但是不超过 m 次
例子:a?bc 表示在一个字符串中a出现0次或1次,abc或bc都可以匹配,aabc不可匹配
捕获组和非捕获组
组的表示方法:
捕获组
捕获组可以通过从左到右计算其开括号来编号。例如,在表达式 ((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,通过零宽度的负 lookbehind 即右侧匹配
这四个非捕获组用于匹配表达式X,但是不包含表达式的文本。
(?=X )
零宽度正先行断言。仅当子表达式 X 在 此位置的右侧匹配时才继续匹配。例如,\w+(?=\d) 与后跟数字的单词匹配,而不与该数字匹配。此构造不会回溯。
(?!X)
零宽度负先行断言。仅当子表达式 X 不在 此位置的右侧匹配时才继续匹配。例如,例如,\w+(?!\d) 与后不跟数字的单词匹配,而不与该数字匹配。
(?<=X)
零宽度正后发断言。仅当子表达式 X 在 此位置的左侧匹配时才继续匹配。例如,(?<=19)99 与跟在 19 后面的 99 的实例匹配。此构造不会回溯。
(?<!X)
零宽度负后发断言。仅当子表达式 X 不在此位置的左侧匹配时才继续匹配。例如,(?<!19)99 与不跟在 19 后面的 99 的实例匹配
说明:
非捕获组中四个表达式的区别:
(?=X ) 和(?!X)用于右侧匹配
(?<=X)和(?<!X)用于左侧匹配
举例:
上面都是理论性的介绍,这里就使用一些例子来说明一下问题:
1、测试匹配性 (abc)+def(?<!4)56(?=9) 这里的含义就是匹配 以一个或多个abc开头后跟def的文本,而且后面的文本56前面不能是4,后面必须是9组成。因此,可以匹配如下文本 abcdef5569 ,与abcdef4569不匹配。
2 、提取字符串 提取 da12bka3434bdca4343bdca234bm 提取包含在字符a和b之间的数字,但是这个a之前的字符不能是c,b后面的字符必须是d才能提取。
例如这里就只有3434这个数字满足要求。那么我们怎么提取呢?
首先我们写出提取这个字符串的表达式: (?<!c)a(\d+)bd 这里就只有一个捕获组(\d+)
JAVA代码片段如下:
Pattern p = Pattern.compile("(?<!c)a(\\d+)bd"); Matcher m = p.matcher("da12bca3434bdca4343bdca234bm"); while(m.find()){ System.out.println(m.group(1)); //我们只要捕获组1的数字即可。结果 3434 System.out.println(m.group(0)); // 0组是整个表达式,看这里,并没有提炼出(?<!c)的字符 。结果 a3434bd }
可以看到,非捕获组,最后是不会返回结果的,因为它本身并不捕获文本。
/** * */ package cn.com.kn.test; import java.util.regex.Matcher; import java.util.regex.Pattern; /** * 功能说明: 2009-1-13 上午10:27:44 * * @author gmw * */ public class PatternTest { public void testParttern(){ //表达式的功能:验证必须为数字(整数或小数) String pattern = "[0-9]+(.[0-9]+)?"; //对()的用法总结:将()中的表达式作为一个整体进行处理,必须满足他的整体结构才可以。 //(.[0-9]+)? :表示()中的整体出现一次或一次也不出现 Pattern p = Pattern.compile(pattern); Matcher m = p.matcher("2"); boolean b = m.matches(); if(b){ System.out.println("istrue:"+b); } } public static void main(String[] args) { PatternTest pt = new PatternTest(); // pt.testFormat("2"); pt.testParttern(); } }
相关推荐
### 常用Java正则表达式知识点 #### 一、引言 正则表达式是一种强大的工具,用于处理文本并查找模式。多种编程语言,包括Perl、PHP、Python、JavaScript以及Java等均内置了对正则表达式的支持。本文将详细介绍Java...
Java正则表达式是Java编程语言中用于处理字符串的强大工具,它基于模式匹配的概念,能够高效地进行文本搜索、替换和解析。在Java中,正则表达式主要通过`java.util.regex`包来实现,提供了Pattern和Matcher两个核心...
在Java编程语言中,正则表达式被广泛应用于数据验证、文本提取和字符串操作。以下是对这些文档标题所涉及的Java正则表达式知识点的详细解释: 1. **正则表达式之道** 这个主题可能涵盖了正则表达式的基础概念,...
### Java正则表达式的应用与理解 #### 一、引言 正则表达式作为一种强大的字符串处理工具,自诞生以来就在计算机科学领域扮演着至关重要的角色。最初由数学家Stephen Kleene提出,正则表达式逐渐发展成为一种普遍...
总之,`regex-smart.jar`是一个旨在简化Java正则表达式应用的库,它提供了预定义的验证和处理方法,使得开发者能更专注于业务逻辑,而不是复杂的正则表达式编写。通过使用这个库,你可以更加高效地完成字符串的验证...
### Java正则表达式判断字符串是否包含中文 在日常的软件开发过程中,我们经常会遇到需要对输入的字符串进行校验的情况。例如,在处理用户输入、文本分析或数据清洗时,可能需要判断一个字符串中是否包含中文字符。...
在Java中使用正则表达式来判断字符串是否符合整数、小数或实数的格式是一种常见且有效的做法。在编程中,我们经常需要对输入的字符串进行格式验证,以确保它们符合预期的数值格式,尤其是在处理财务数据、用户输入...
本文将围绕一个特定的正则表达式 `/^([A-Za-z0-9])+$/` 展开讨论,该表达式主要用于验证输入字符串是否仅包含数字和字母。 #### 正则表达式解析 该正则表达式 `/^([A-Za-z0-9])+$/` 可以被细分为几个关键部分进行...
根据给定的文件信息,我们可以总结出以下关于Java正则表达式的重要知识点: ### 1. 正则表达式简介 正则表达式是一种强大的文本处理工具,它能够帮助我们匹配、查找、替换等操作符合某种规则的字符串。在Java中,...
Java正则表达式验证IP地址是指使用Java语言中的正则表达式来验证IP地址是否符合标准。IP地址是指在网络通信中用来标识设备的地址,它是一种逻辑地址,通过它可以找到网络中的设备。在Java中,可以使用正则表达式来...
通过上述讨论,我们了解到如何构建一个正则表达式来判断字符串是否除了指定字符外不含其他特殊字符。这种方法不仅适用于简单的字符验证场景,还可以扩展应用于更复杂的数据清洗和格式化任务中。对于开发者而言,熟练...
Java正则表达式详解 Java正则表达式是Java语言中的一种模式匹配技术,用于匹配、查找、替换和判断字符串。它是一种强大的工具,能够帮助开发者快速处理字符串相关的任务。 什么是正则表达式? 正则表达式是一种...
除了上述纯正则表达式的示例,文件还包含了JavaScript事件处理函数中的正则应用案例,这些函数用于限制输入字段的字符类型,例如只允许中文、全角字符或数字输入,以及验证字符串中是否存在非ASCII字符。 这些正则...
Java正则表达式是一种强大的文本处理工具,广泛用于验证字符串、查找特定模式和替换文本。在Java中,正则表达式提供了简洁而灵活的方式来处理字符串,使得编程人员能够以更高效的方式实现各种文本操作。 正则表达式...
总结来说,Java正则表达式在Android开发中扮演着不可或缺的角色,它提供了一种灵活的方式来处理和验证字符串数据。通过熟练掌握正则表达式,开发者能够提高应用程序的质量,确保用户输入的有效性,并优化文本处理...
这个函数可以根据传入的最小值和最大值生成合适的正则表达式,用于验证字符串是否符合指定范围的浮点数。 在实际应用中,这个正则表达式可以与Java的`Pattern`和`Matcher`类配合使用,进行浮点数的验证。例如: ``...
- `Matcher`对象的`matches()`方法检查整个输入字符串是否符合模式。 - `find()`方法寻找输入字符串中的第一个匹配项。 5. 分组与捕获: - 使用括号()创建分组,捕获子表达式。 - `group(int group)`方法用于...
### 使用Java正则表达式实现一个简单的身份证号码验证 #### 一、背景介绍 身份证号码是中国公民的身份标识,由15位或18位数字组成(早期为15位,后改为18位)。其中,第18位是校验码,可能是数字0~9或者大写字母X。...
Java正则表达式是编程语言Java中用于处理字符串的强大工具,它允许我们通过模式匹配来查找、替换或提取文本。这个“java正则表达式检查”小工具专门用于测试正则表达式的有效性,帮助开发者验证自己的正则表达式是否...
这个合集提供的HTML和Java正则表达式实例,为开发者提供了一个快速参考的工具,帮助他们在开发过程中快速有效地实现数据验证功能。理解并熟练运用这些正则表达式,对于提高代码质量和用户体验都有极大的帮助。在实际...