这里不打算说明正则表达式的具体细节,只讲Java中使用正则表达式的一些基础知识。
一个简单的例子,使用正则表达式来匹配电话号码,电话号码包括了三到四位的区号;可有可无的连接符;6位到八位的电话号码。正则表达式如下:
\d{3,4}-?\d{6,9}
这里仅仅是举个例子,实际使用中,考虑到电话号码的合法性,区号还需要改进。简单而言,像下面这样就能使用这个正则表达式对字符串进行验证了:
boolean match = Pattern.matches("\\d{3,4}-?\\d{6,9}", "010-23232222");
match就是我们需要的验证结果。
也可以转换成Matcher对象再调用Matcher的matches方法:
Pattern pattern = Pattern.compile("\\d{3,4}-?\\d{6,9}");
//boolean match = Pattern.matches("\\d{3,4}-?\\d{6,9}", "010-23232222");
Matcher matcher = pattern.matcher("010-23232222");
System.out.println(matcher.matches());
这里,仅仅是验证一个字符串是否符合正则表达式,这是最简单的应用。如果想要在在一个字符串中进行匹配查找,就需要使用到Matcher对象了:
Pattern pattern = Pattern.compile("\\d{3,4}-?\\d{6,9}");
Matcher matcher = pattern.matcher("联系电话:010-23232222,地址:北京市朝阳区...");
while(matcher.find()){
System.out.println(matcher.group());
}
这样,就能从字符串中摘取出符合正则表达式的内容了。
匹配模式
有的时候,需要进行忽略大小写的匹配:
String moneyRegex = "[+-]?(\\d)+(.(\\d)*)?(\\s)*[CF]";
String input = "-3.33c";
boolean match = Pattern.compile(moneyRegex,Pattern.CASE_INSENSITIVE).matcher(input).matches();
该例子实现匹配摄氏温度和华氏温度,对于以C、c、F和f结尾的温度值都能匹配。
这是依赖于API来忽略大小写,正则表达式内部也支持忽略大小写:
String moneyRegex = "[+-]?(\\d)+(.(\\d)*)?(\\s)*(?i)[CF]";
String input = "-3.33f";
boolean match = Pattern.compile(moneyRegex).matcher(input).matches();
Java还提供了很多类似于CASE_INSENSITIVE的模式标记,多个模式标记可以使用“|”符号连接。
Pattern.CANON_EQ:启用正则等价。
Pattern.COMMENTS:启用注释,开启之后,正则表达式中的空格以及#号行将被忽略:
String comments = " (\\d)+#this is comments.";
String input = "1234";
boolean match = Pattern.compile(comments,Pattern.COMMENTS).matcher(input).matches();//true
boolean match2 = Pattern.compile(comments).matcher(input).matches();//false
可以看到,#号到行尾的注释部分和前面的空白字符都被忽略了。正则表达式内置的启用注释为(?x):
String comments = "(?x) (\\d)+#this is comments.";
String input = "1234";
boolean match = Pattern.compile(comments,Pattern.COMMENTS).matcher(input).matches();//true
boolean match2 = Pattern.compile(comments).matcher(input).matches();//true
Pattern.DOTALL:启用dotall模式,一般情况下,点号(.)匹配任意字符,但不匹配换行符,启用这个模式之后,点号还能匹配换行符:
String dotall = "<xml>(.)*</xml>";
String dotallInput = "<xml>\r\n</xml>";
boolean match = Pattern.compile(dotall,Pattern.DOTALL).matcher(dotallInput).matches();//true
boolean match2 = Pattern.compile(dotall).matcher(dotallInput).matches();//false
使用内置方式:
String dotall = "(?s)<xml>(.)*</xml>";
String dotallInput = "<xml>\r\n</xml>";
boolean match = Pattern.compile(dotall,Pattern.DOTALL).matcher(dotallInput).matches();//true
boolean match2 = Pattern.compile(dotall).matcher(dotallInput).matches();//true
Pattern.LITERAL:平白字符模式,启用这个模式之后,所有元字符、转义字符都被看成普通的字符,不再具有其他意义:
System.out.println(Pattern.compile("\\d",Pattern.LITERAL).matcher("\\d").matches());//true
System.out.println(Pattern.compile("\\d",Pattern.LITERAL).matcher("2").matches());//false
System.out.println(Pattern.compile("(\\d)+",Pattern.LITERAL).matcher("1234").matches());//false
System.out.println(Pattern.compile("(\\d)+").matcher("1234").matches());//true
System.out.println(Pattern.compile("(\\d){2,3}",Pattern.LITERAL).matcher("(\\d){2,3}").matches());//true
Pattern.MULTILINE:多行模式:默认情况下,输入的字符串被看作是一行,即便是这一行中包好了换行符也被看作一行。当匹配“^”到“$”之间的内容的时候,整个输入被看成一个一行。启用多行模式之后,包含换行符的输入将被自动转换成多行,然后进行匹配:
String multiline = "^(\\d)+$";
String multilineInput = "1234\r99\rabc\r128";
Pattern p = Pattern.compile(multiline, Pattern.MULTILINE);
Matcher m = p.matcher(multilineInput);
while(m.find()){
System.out.println(m.group());
}
例子中,将字符串中的数字摘取出来,如果不启用多行模式,将什么也匹配不到。可以用(?m)在正则表达式内部启用多行模式。
Pattern.UNIX_LINE:unix行模式,大多多数系统的行都是以“\n”结尾的,但是少数系统,比如Windows,却是以“\r\n”组合来结尾的,启用这个模式之后,将会只以“\n”作为行结束符,这会影响到^、$和点号(点号匹配换行符)。
Pattern方法
split方法
Pattern提供了一个split方法,可以按照给定的正则表达式将字符串进行分割:
String splitRegex = "\\([A-D]\\)";
String splitInput = "(A)非常满意 (B)满意 (C)一般 (D)不满意";
Pattern splitPattern = Pattern.compile(splitRegex);
for(String str : splitPattern.split(splitInput)){
System.out.println(str);
}
运行结果:
非常满意
满意
一般
不满意
quote方法
有点儿类似于Pattern.LITERAL的功能,方法可以为给定的字符串创建LITERAL模式的正则表达式:
String quote = Pattern.quote("\\d");
System.out.println(Pattern.matches(quote, "\\d"));//true
System.out.println(Pattern.matches("\\d", "\\d"));//false
String类也提供了一些支持正则表达式的方法:
matches方法:
String str = "1234";
System.out.println(str.matches("(\\d)+"));//true
字符串的split方法和replace方法也支持正则表达式:
String str2 = "a.1分 b.2分 c.3分 d.4分";
for(String score : str2.split("[a-d]+\\.")){
System.out.println(score);
}
String str2 = "a.1分 b.2分 c.3分 d.4分";
str2 = str2.replaceAll("([a-d])+\\.", "[$1]");
System.out.println(str2);
运行结果:
[a]1分 [b]2分 [c]3分 [d]4分
这里用到了
反向引用,$1表示的就是匹配出来的[a-d]。
Matcher方法:
lookingAt方法:
String str3 = "foooooooooooo";
Matcher matcher3 = Pattern.compile("foo").matcher(str3);
System.out.println(matcher3.lookingAt());//true
System.out.println(matcher3.matches());//false
字符串是否包含所指定的正则表达式,不用通过find方法挨个找,lookingAt可以一次性实现这个功能。
字符串替换:
double d = 1.0 / 3;
String numberRegex = "(\\d+\\.\\d{2,3})\\d*";
Matcher matcher4 = Pattern.compile(numberRegex).matcher("one divide by three eq : " + d +"");
String result = matcher4.replaceFirst("$1");
System.out.println(result);// OUPUT: one divide by three eq : 0.333
以上代码实现讲字符串保留小数的功能(只有两位小数位则不动)。
分享到:
相关推荐
2. **Java中的正则表达式**: Java提供了`java.util.regex`包,通过`Pattern`和`Matcher`类支持正则表达式。以下是如何在Java中验证电话号码的一个例子: ```java import java.util.regex.Pattern; import java....
在Java中,可以使用正则表达式来提取XML节点内容。下面是一个简单的示例: ```java public static List<String> getContext(String html) { List<String> resultList = new ArrayList(); Pattern p = Pattern....
在Java中,正则表达式是通过java.util.regex包提供的类来实现的,主要包括Pattern和Matcher两个核心类。这篇博客将深入探讨正则表达式在Java代码中的应用。 首先,创建一个正则表达式需要使用Pattern类。Pattern类...
Java正则表达式是Java语言中用于处理字符串的强大工具,它允许程序员进行复杂的字符串匹配、查找和替换操作。正则表达式(Regular Expression)是一种模式匹配语言,通过特定的语法来描述字符串的模式,用于在文本中...
在Java中,我们可以使用`Pattern`和`Matcher`类来处理正则表达式。`Pattern`类负责编译正则表达式,而`Matcher`类则用于在特定输入字符串上执行模式匹配。例如: ```java String regex = "\\w+@\\w+\\.com"; ...
在Java中,正则表达式主要通过`java.util.regex`包来实现,提供了Pattern和Matcher两个核心类。 **1. Pattern类** Pattern类是Java正则表达式的起点,它将一个正则表达式编译成一个模式对象。这个编译过程可以优化...
在Java中,正则表达式的使用主要依赖于`java.util.regex`包中的类,如`Pattern`和`Matcher`。 首先,我们来看`Pattern`类。这个类是正则表达式的模板,负责编译和存储正则表达式。一旦正则表达式被编译为`Pattern`...
"PB正则表达式"标签直接指向了我们讨论的主题,即在PowerBuilder中使用正则表达式。"PBRegExp"可能是作者创建的一个类或者函数库,用于封装正则表达式的操作。"正则表达式"标签进一步强调了我们要探讨的核心技术。...
在Java中,通过`java.util.regex`包提供了对正则表达式的支持。 ### 2. 邮箱地址验证 在实际应用中,经常需要验证用户输入的邮箱地址是否有效。文件中的方法`checkEmail`实现了这一功能,其正则表达式为: ```java...
Java中的正则表达式主要通过`java.util.regex`包中的类来实现,如`Pattern`和`Matcher`。 在日志处理中,我们通常需要完成以下任务: 1. **过滤日志级别**:日志通常包含不同的级别,如DEBUG、INFO、WARN、ERROR等...
正则表达式的学习需要对元字符、量词、预查、后向引用等概念有深入理解,同时掌握Java中`Pattern`和`Matcher`的使用方法,结合实际案例进行实践,才能灵活运用到实际项目中。在处理字符串相关问题时,熟练掌握正则...
在Java中使用正则表达式通常涉及`java.util.regex`包中的类,如`Pattern`和`Matcher`。首先,通过`Pattern.compile()`方法编译正则表达式,然后使用`Matcher`对象的`find()`, `matches()`, `group()`等方法进行匹配...
正则表达式(Regular Expression)是一种强大的工具,用于在字符串中匹配特定模式,它在这里被用来判断用户设定的密码是否符合一定的强度标准。以下是对这个话题的详细解释。 首先,密码强度通常涉及到以下几个方面...
在Java中,正则表达式通常与`Pattern`和`Matcher`两个类一起使用。`Pattern`类用于编译正则表达式,而`Matcher`类则用于执行匹配操作。例如,我们可以这样创建一个`Pattern`对象并进行匹配: ```java String regex ...
最完善的身份证号码合法性校验Java算法,适合Android平台,可以直接拿来在项目中使用,正则表达式。
正则表达式的使用非常广泛,它们在编程语言中作为内置函数或库提供,用于字符串处理、数据验证、文本分析等任务。掌握正则表达式可以极大地提高你的文本处理能力,尤其在处理大量数据或需要严格验证用户输入的场景下...
在Java中使用正则表达式来判断字符串是否符合整数、小数或实数的格式是一种常见且有效的做法。在编程中,我们经常需要对输入的字符串进行格式验证,以确保它们符合预期的数值格式,尤其是在处理财务数据、用户输入...
在Java中,我们可以使用java.util.regex包来使用正则表达式。在这个包中,有两个主要的类:Pattern和Matcher。 Pattern类是正则表达式的编译表示形式,它将正则表达式编译成一个模式,使其可以被Matcher类使用。...
本篇将深入探讨Java中的字符串、正则表达式及其在实际编程中的详细实例代码。 1. **字符串基础** - Java中的字符串是不可变的,这意味着一旦创建了字符串对象,就不能更改其内容。这由`final`关键字确保,提高了...
在正则表达式中,可以使用字符集合([xxx])来匹配某些字符中的一个字符。字符集合可以通过显示声明每一个字符,或者通过连字符(-)来指定一个范围的字符。同时,字符集合还可以通过^来声明一个取反的字符集合,即...