工作中有一段时间经常使用Java的正则表达式,整理一下,做个总结。
JDK中提供了2个类来支持正则表达式,分别是java.util.regex.Pattern和java.util.regex.Matcher。前者表示一个模式,后者表示一个匹配器。
我们在日常使用中,一般会根据需要,建立一个模式。模式的构建通过下面方法:
public static Pattern compile(String regex) {
return new Pattern(regex, 0);
}
或者
public static Pattern compile(String regex, int flags) {
return new Pattern(regex, flags);
}
构建模式时,我们需要传入一个表达式和Match Flags(如果需要的话)。然后便可以得到一个根据传入的字符串型正则表达式而生成的模式实例。可以用这个实例来匹配一些字符串,调用如下方法:
public Matcher matcher(CharSequence input)
此方法返回一个匹配器,接着调用匹配器的相关方法便可判断目标字符串是否匹配我们构建的模式。方法如下:
public boolean matches()
举个简单的例子,现在要判断一个字符串是否是一个以186开头,一共11位的手机号码:
public static void main(String[] args) {
//目标字符串
String s = "18612345678";
//创建匹配模式
Pattern pattern = Pattern.compile("^186\\d{8}$");
//得到匹配器
Matcher matcher = pattern.matcher(s);
//打印匹配结果
System.out.println("isMatch="+matcher.matches());
}
输出为:
isMatch=true
符号'^'表示一行的开始;'\\d'表示数字,这里两个'\'是因为反斜杠在java的字符串中需要转义;'{8}'跟在'\\{d}'后面表示有8个这样的数字;'$'表示一行的结束
下面是一些常用正则表达式的字符集、运算符、匹配符等。
\xhh | 16进制值0xhh 所表示的字符 |
\uhhhh | 16进制值0xhhhh 所表示的Unicode字符 |
\t | Tab |
\n | 换行符 |
\r | 回车符 |
\f | 换页符 |
\e | Escape |
. | 表示任意一个字符 |
[abc] | 表示字符a ,b ,c 中的任意一个 |
[^abc] | 除a ,b ,c 之外的任意一个字符 |
[a-zA-Z] | 从a 到z 或A 到Z 当中的任意一个字符 |
[abc[hij]] | a,b,c,h,i,j 中的任意一个字符 |
[a-z&&[hij]] | h,i,j 中的一个 |
\s | 空格字符(空格键, tab, 换行, 换页, 回车) |
\S | 非空格字符([^\s] ) |
\d | 一个数字,也就是[0-9] |
\D | 一个非数字的字符,也就是[^0-9] |
\w | 一个单词字符(word character),即[a-zA-Z_0-9] |
\W | 一个非单词的字符,[^\w] |
XY | X 后面跟着 Y |
X|Y | X或Y |
(X) | 一个"要匹配的组(capturing group)". 以后可以用\i来表示第i个被匹配的组 |
^ | 一行的开始 |
$ | 一行的结尾 |
\b | 一个单词的边界 |
\B | 一个非单词的边界 |
\G | 前一个匹配的结束 |
X? | 匹配一个或零个X |
X* | 匹配零或多个X |
X+ | 匹配一个或多个X |
X{n} | 匹配正好n个X |
X{n,} | 匹配至少n个X |
X{n,m} | 匹配至少n个,至多m个X |
我们可以匹配一个比较长的字符串。
public static void main(String[] args) {
//目标字符串
String input = "127.0.0.1 - - [22/May/2013:23:33:45 +0800] \"GET / HTTP/1.1\" 200 7446";
//创建匹配模式
Pattern pattern = Pattern.compile("^\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}\\s+\\S+\\s+\\S+\\s+\\[[^\\]]+\\]\\s+\"\\S+\\s+/\\s+[^\"]+\"\\s+\\d+\\s+\\d+$");
//得到匹配器
Matcher matcher = pattern.matcher(input);
//打印匹配结果
System.out.println("isMatch="+matcher.matches());
}
输出为:
isMatch=true
观察上面例子的目标字符串(实际上是tomcat的访问日志,这里的正则表达式并不严格,只是做一个简单示范),我们有时可能想要从这些字符串中把一些敏感信息取出来,比如上面目标字符串中的‘IP地址’、‘时间部分’、‘请求方法’、‘协议部分’、‘状态码’。我就需要在表达式中加入捕获式‘()’,然后通过Matcher的API将这些部分取出来,代码如下:
public static void main(String[] args) {
//目标字符串
String input = "127.0.0.1 - - [22/May/2013:23:33:45 +0800] \"GET / HTTP/1.1\" 200 7446";
//创建匹配模式
Pattern pattern = Pattern.compile("^(\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}\\.\\d{1,3})\\s+\\S+\\s+\\S+\\s+\\[([^\\]]+)\\]\\s+\"(\\S+)\\s+/\\s+([^\"]+)\"\\s+(\\d+)\\s+\\d+$");
//得到匹配器
Matcher matcher = pattern.matcher(input);
if(matcher.find()){
for(int i=1;i<=matcher.groupCount();i++){
System.out.println("第"+i+"个捕获的内容为:"+matcher.group(i));
}
}
}
输出为:
第1个捕获的内容为:127.0.0.1
第2个捕获的内容为:22/May/2013:23:33:45 +0800
第3个捕获的内容为:GET
第4个捕获的内容为:HTTP/1.1
第5个捕获的内容为:200
注意:matcher的第一个组"matcher.group(0)"为input本身。
另外,我们可以在正则表达式中通过‘\i’来引用前面第i个捕获内容,代码如下:
public static void main(String[] args) {
//目标字符串 假设我们要匹配一段被双引号或者单引号修饰的字符串
String s = "\"src\"";
//创建匹配模式
Pattern pattern = Pattern.compile("^([\"'])[^\"]+\\1$");
//得到匹配器
Matcher matcher = pattern.matcher(s);
//打印匹配结果
System.out.println("isMatch="+matcher.matches());
}
输出为:
isMatch=true
注意:‘\1’引用的是第一个捕获的实际内容,而不是表达式里括号的内容。也就是说,如果目标字符串右侧的双引号变成单引号,那么结果为false。
我们也可以在替换字符串的时候来引用捕获的内容,代码如下:
public static void main(String[] args) {
//目标字符串 把所有的小数后面2位以后的部分截掉,不考虑四舍五入
String s = "a:3.567 b:1.2355 c:0.4401";
//创建匹配模式
Pattern pattern = Pattern.compile("(\\d\\.\\d\\d)\\d*");
//得到匹配器
Matcher matcher = pattern.matcher(s);
s = matcher.replaceAll("$1");
System.out.println("s="+s);
}
输出为:
s=a:3.56 b:1.23 c:0.44
上面的代码也可以直接写成:
s = s.replaceAll("(\\d\\.\\d\\d)\\d*", "$1");
关于Java正则表达式一些基础的东西简单总结到这里。
分享到:
相关推荐
为了帮助开发者更好地掌握Java正则表达式技术,我们提供了一系列的Java正则表达式技巧大全,包括《Java正则表达式技巧大全》、《Java数据结构与算法教程》、《Java操作DOM节点技巧总结》、《Java文件与目录操作技巧...
以下是对这些文档标题所涉及的Java正则表达式知识点的详细解释: 1. **正则表达式之道** 这个主题可能涵盖了正则表达式的基础概念,包括元字符、字符类、量词和分组。元字符如`.`代表任意字符,`^`表示行首,`$`...
### 常用Java正则表达式知识点 #### 一、引言 正则表达式是一种强大的工具,用于处理文本并查找模式。多种编程语言,包括Perl、PHP、Python、JavaScript以及Java等均内置了对正则表达式的支持。本文将详细介绍Java...
正则表达式基础知识 ------------------- 正则表达式是一种字符构成的串,它定义了一个用来搜索匹配字符串的模式。许多语言,包括 Perl、PHP、Python、JavaScript 和 JScript,都支持用正则表达式处理文本。 句点...
本篇将深入探讨Java中的字符串、正则表达式及其在实际编程中的详细实例代码。 1. **字符串基础** - Java中的字符串是不可变的,这意味着一旦创建了字符串对象,就不能更改其内容。这由`final`关键字确保,提高了...
Java正则表达式是一种强大的文本处理工具,广泛用于验证字符串、查找特定模式和替换文本。在Java中,正则表达式提供了简洁而灵活的方式来处理字符串,使得编程人员能够以更高效的方式实现各种文本操作。 正则表达式...
Java正则表达式是编程语言Java中的一个强大工具,它用于模式匹配、数据验证和文本检索替换。在Java中,正则表达式是通过java.util.regex包提供的接口和类来实现的。`regex-smart.jar`这个库显然是为了简化开发者在...
#### 一、正则表达式基础知识 正则表达式是一种强大的文本处理工具,被广泛应用于各种编程语言中,用于文本的查找与替换、验证等场景。Java作为一种主流的编程语言,同样支持正则表达式的使用。 ##### 1.1 句点...
以上给出的正则表达式仅覆盖了一些基础用例,实际的正则表达式可以变得极其复杂,涉及更多的元字符和修饰符,如贪婪与非贪婪匹配、分组、零宽断言等。正则表达式的学习和掌握需要时间和实践,但一旦熟悉,它们将成为...
在学习Java正则表达式时,不仅要掌握基础语法,还要通过实践不断加深理解和熟练运用。视频教程是一个很好的学习资源,可以通过观看实际操作来更好地理解正则表达式的用法。通过提供的百度网盘链接...
在这个场景中,我们关注的是如何使用Java结合正则表达式进行文本处理。正则表达式(Regular Expression)是一种模式匹配工具,能够有效地在文本中查找、替换或提取特定的字符串。 Java中对正则表达式的支持主要体现...
5. **教程和帮助文档**:通常,软件会附带详细的使用说明或教程,帮助用户学习和理解正则表达式的基础知识和高级技巧。 压缩包内的`regexBuilderSetup_std.exe`是安装程序,用户可以通过运行这个文件来安装正则...
例如,以下代码展示了如何使用Java正则表达式检查字符串是否符合社会安全号码的格式: ```java import java.util.regex.*; public class Main { public static void main(String[] args) { String ssn = "123-12...
正则表达式基础 正则表达式(Regular Expression)是一种模式,用来匹配一系列字符串。在Java中,字符串与正则表达式之间的操作主要由`Pattern`、`Matcher`和`String`类的`matches()`、`split()`和`replaceAll()`...
正则表达式是一种强大的文本处理工具,广泛应用于JavaScript和Java等编程语言中,用于执行复杂的字符串匹配、查找、替换和提取等操作。本教程将深入探讨JavaScript和Java中的正则表达式及其应用场景。 首先,我们...
### Java正则表达式判断字符串是否包含中文 在日常的软件开发过程中,我们经常会遇到需要对输入的字符串进行校验的情况。例如,在处理用户输入、文本分析或数据清洗时,可能需要判断一个字符串中是否包含中文字符。...
#### 二、Java正则表达式基础 正则表达式是由普通字符和特殊字符(也称为元字符)组成的一种模式匹配工具。它能够帮助我们快速地在文本中找到符合特定模式的字符串。在Java中,正则表达式主要通过`java.util.regex`...