博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Java正则表达式
阅读量:6958 次
发布时间:2019-06-27

本文共 5021 字,大约阅读时间需要 16 分钟。

Java正则表达式量词

可以指定正则表达式中的字符的次数可以匹配字符序列。为了使用正则表达式表达一个数字或更多的模式,我们可以是用量词。下面列出了量词及其含义。

  • *  0次或者更多次
  • +    1次或者多次
  • ?       1次或者根本不
  • {m}    正好m次
  • {m,}   至少m次
  • {m,n}  至少m,但不超过n次
package com.fpc.Test;import java.util.regex.Matcher;import java.util.regex.Pattern;public class regexTest {    public static void main(String[] args) {        String regex1 = "\\b(\\d{3})\\d{7}\\b";        Pattern pattern1 = Pattern.compile(regex1);        String condidateString1 = "12345678, 12345, and 9876543210";        Matcher m1 = pattern1.matcher(condidateString1);        while(m1.find()) {            System.out.println("phone Number: " + m1.group() + " area Code: " + m1.group(1));        }    }}

Matcher.group函数的用法:group()是针对()来说的,group(0)就是指整个串,group(1)指的是第一个括号里的东西,group(2)指的是第二个括号里的东西。

 Java正则表达式边界

要匹配一行的开头,或匹配整个单词,不是任何单词的一部分,必须为匹配器设置边界。下面列出了正则表达式中的边界匹配器。

  • ^ 一行的开始
  • $ 一行的结束
  • \b 字边界
  • \B 非字边界
  • \A 输入的开始
  • \G 上一次匹配结束
  • \Z 输入的结束,但是对于最终终止符,如果有的话
  • \z 输入的结束
String regex = "\\bJava\\b";        String condidateString = "Java and Javascript";        String replaceString = "XML";        String newString = condidateString.replaceAll(regex, replaceString);        System.out.println(newString);

运行结果:

如果将condidateString 改成“Java and Java script”呢?

Java正则表达式组

可以通过括号将多个字符组合为一个单位,例如,(ab)。正则表达式中的每个组都有一个组号,从1开始。Matcher类中的方法groupCount()返回的是正则表达式字符串中"()"的数量。正则表达式中的每个左括号标记新组的开始。

也可以在正则表达式中返回引用组号:假设我们要匹配“abc”开头,后面跟“xyz”的文本,后面跟“abc”,我们可以写一个正则表达式"abcxyzabc",也可以使用反向引用将正则表达式重写为:“(abc)xyz\\1” ,\1指第一组,即(abc)。\2引用组2,\3引用组3,依次类推。

格式化电话号码的例子:

package com.fpc.Test;import java.util.regex.Matcher;import java.util.regex.Pattern;public class regexTest {    public static void main(String[] args) {        //Formart Phone Number        String regex2 = "(\\d{3})(\\d{3})(\\d{4})";        String condidateString2 = "1234567890, 12345,  and  9876543210";        Matcher m3 = Pattern.compile(regex2).matcher(condidateString2);        while( m3.find() ) {            System.out.println("Origional Phone Number : " + m3.group(0) + " Formart Phone Number : "+ "(" + m3.group(1) + ")" + m3.group(2) + "-" + m3.group(3));        }    }}

运行结果:

以下代码显示如何引用替换文本中的组。

$n,其中n是组编号,替换文本内部是指组n的匹配文本。例如$1指第一个匹配的组,要重新格式化电话号码,将使用($1) $2-$3.

package com.fpc.Test;import java.util.regex.Matcher;import java.util.regex.Pattern;public class regexTest {    public static void main(String[] args) {        //Formart Phone Number        String regex2 = "(\\d{3})(\\d{3})(\\d{4})";        String condidateString2 = "1234567890, 12345,  and  9876543210";        Matcher m3 = Pattern.compile(regex2).matcher(condidateString2);        String replaceText = "($1)$2-$3";        System.out.println(m3.replaceAll(replaceText));    }}

运行结果:

 Java正则表达式命名组

可以在正则表达式中使用命名组,可以命名一个组,然后使用它们的名字来引用参考组。

定义命名组的格式为:

(?
pattern)

仍然是上面的格式化电话号码的例子,其中使用了命名组:

package com.fpc.Test;import java.util.regex.Matcher;import java.util.regex.Pattern;public class regexTest {    public static void main(String[] args) {        //Formart Phone Number        String regex2 = "(\\d{3})(\\d{3})(\\d{4})";        String regex3 = "(?
\\d{3})(?
\\d{3})(?
\\d{4})"; String condidateString2 = "1234567890, 12345, and 9876543210"; Matcher m3 = Pattern.compile(regex2).matcher(condidateString2); String replaceText = "($1)$2-$3"; String repalceText1 = "(${areaNumber})${prefixPhoneNumber}-${postPhoneNumber}"; System.out.println(m3.replaceAll(replaceText)); Matcher m4 = Pattern.compile(regex3).matcher(condidateString2); System.out.println(m4.replaceAll(repalceText1)); }}

运行结果:

Java正则表达式组边界

可以使用start()和end()方法来获取组的匹配边界。这些方法重载:

int start()int start(int groupNumber)int start(String groupName)int end()int end(int groupNumber)int  end(String groupName)

例子,显示如何匹配10位电话号码,并未每个成功匹配打印每个组的开始:

package com.fpc.Test;import java.util.regex.Matcher;import java.util.regex.Pattern;public class regexTest {    public static void main(String[] args) {        //Formart Phone Number        String regex2 = "(\\d{3})(\\d{3})(\\d{4})";        String regex3 = "(?
\\d{3})(?
\\d{3})(?
\\d{4})"; String condidateString2 = "1234567890, 12345, and 9876543210"; String repalceText1 = "(${areaNumber})${prefixPhoneNumber}-${postPhoneNumber}"; Matcher m4 = Pattern.compile(regex3).matcher(condidateString2); while ( m4.find() ) { int start1 = m4.start("areaNumber"); int start2 = m4.start("prefixPhoneNumber"); int satart3 = m4.start("postPhoneNumber"); System.out.println("Matched Text:" + m4.group(0)); System.out.println("Area code start:" + start1); System.out.println("Prefix start:" + start2); System.out.println("Post Number start:" + satart3); } }}

运行结果:

Matched Text:1234567890Area code start:0Prefix start:3Post Number start:6Matched Text:9876543210Area code start:23Prefix start:26Post Number start:29

 

转载于:https://www.cnblogs.com/fangpengchengbupter/p/7908177.html

你可能感兴趣的文章
安装redis(3.2.9)
查看>>
shell脚本之一
查看>>
oracle 12c 关闭统计信息收集和启用统计信息收集
查看>>
修复微商城提交购物车时部分手机号码不识别
查看>>
基于 HTML5 Canvas 的 3D 模型列表贴图
查看>>
ORA-00000 这是什么报错!
查看>>
lvs-dr简单配置
查看>>
hadoop配置lzo
查看>>
脚本调试:一次换行符导致的报错
查看>>
mysql 之 主从同步(单向同步和双向同步)
查看>>
Nginx负载均衡、ssl原理、生成ssl密钥对、Nginx配置ssl
查看>>
经典的MySQL 数据备份校验daemon程序
查看>>
logrotate日志轮询
查看>>
python之扩展
查看>>
Redis有序集合数据类型操作命令
查看>>
nginx+tomcat 动静分离 的配置文件
查看>>
SaltStck无Master和多Master架构
查看>>
ajax asynx:false
查看>>
online游戏服务器架构--网络架构
查看>>
tomcat启动比较慢的解决办法
查看>>