java正则表达式 1_1. java 正则表达式

一、正则表达式类

正则表达式的包java.util.regex下的类主要有Pattern类, Matcher类和PatternSyntaxException非强制异常类。

1. Pattern 类:

pattern 对象是一个正则表达式的编译表示。Pattern 类没有公共构造方法。要创建一个 Pattern 对象,你必须首先调用其公共静态编译方法,它返回一个 Pattern 对象。该方法接受一个正则表达式作为它的第一个参数。

2.  Matcher 类:

Matcher 对象是对输入字符串进行解释和匹配操作的引擎。与Pattern 类一样,Matcher 也没有公共构造方法。你需要调用 Pattern 对象的 matcher 方法来获得一个 Matcher 对象。

3. PatternSyntaxException类:

PatternSyntaxException 是一个非强制异常类,它表示一个正则表达式模式中的语法错误。

实例

(1). 匹配

String content1 = "I am youyou from xxt.cn";

String regex1 = ".*xxt.cn.*";

boolean isMatch1 = Pattern.matches(regex1, content1);

logger.info("输入字符串{}中是否包含{}字符串? {}", content1, regex1, isMatch1);

`输入字符串I am youyou from xxt.cn中是否包含.*xxt.cn.*字符串? true`

(2). 捕获组

{

// 按指定模式在字符串查找

String line = "This order was placed for QT3000! OK?";

String regex2 = "(\\D*)(\\d+)(.*)";

// 创建 Pattern 对象

Pattern r = Pattern.compile(regex2);

// 现在创建 matcher 对象

Matcher m = r.matcher(line);

if (m.find()) {

System.out.println("正则表达式的总的捕获组个数:" + m.groupCount());

System.out.println("group(0): " + m.group(0) );

System.out.println("group(1): " + m.group(1) );

System.out.println("group(2): " + m.group(2) );

System.out.println("group(3): " + m.group(3) );

} else {

System.out.println("没有匹配项");

}

}

二、正则表达式相关对象提供的主要方法

Matcher 类的方法

2. 1. 索引方法

索引方法提供了有用的索引值,精确表明输入字符串中在哪能找到匹配:结合matcher.find()方法

1.  int start()

以前匹配的初始索引;

2.  int start(int group)

以前匹配期间,给定组所捕获的子序列的初始化索引;

3. int end()

最后匹配字符之后的偏移量;

4. int end(int group)

以前的匹配期间,给定组捕获的子序列的最后字符之后的偏移量;

2.2. 检查方法

检查匹配方法用来检查输入字符串并返回一个布尔值,表示是否找到该模式

1. boolean lookingAt()

从输入序列开头的位置与该模式匹配,匹配后不偏移。

2. boolean find()

查找与该模式匹配的输入序列的下一个子序列,不断往后偏移匹配。

3. boolean find(int start)

重置匹配器后尝试查找从指定索引开始的输入序列的下一个子序列获取的匹配。

4. matches()

将整个区域与模式匹配。

2.3. 替换方法

替换方法是替换输入字符串里文本的方法。可以结合匹配模式达到指定的需求

1. Matcher appendReplacement(StringBuffer sb, String replacement)

查找匹配并且替换,同时附加替换位置前的内容

2. StringBuffer appendTail(StringBuffer sb)

追加替换位置之后的输入串中的内容

3. String replaceAll(String replacement)

替换输入序列中与匹配模式相匹配的内容为指定的替换字符串内容;方法1和方法2结合也可以达到该目的

4. String replaceFirst(String replacement)

替换输入序列中第一个匹配到模式的字符串序列

5. static String quoteReplacement(String s)

返回指定字符串的字面替换字符串,不明白其使用场景 | | |

2.4.  捕获组

groupCount()用于查看表达式的分组数。特殊组(group(0)),代表整个表达式。该组不包括在 groupCount 的返回值中。

正则表达式实例及描述

正则表达式

含义说明

备注说明

\s+

\s+ 表示匹配多个空格,等同于\s{1,}

^

定义以什么开始

\d

数字字符匹配。

等效于 [0-9]。

\D

非数字字符匹配。

等效于 [^0-9]。

\.

匹配小数点

注意区别转移字符的作用,如果.则表示匹配任意字符

0次或者1次匹配

等效于 {0,1}。

*

零次或多次匹配前面的字符或子表达式。

等效于 {0,}。

\\b

表示边界匹配,可用于避免匹配某一个字符串的子串

例如‘\\bthe\\b’能够匹配the sun,但是无法匹配there

常见问题总结

1. 关于java中的反斜线:

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

在 Java 中,\\ 表示:我要插入一个正则表达式的反斜线,所以其后的字符具有特殊的意义。

所以,在其他的语言中(如Perl),一个反斜杠 \ 就足以具有转义的作用,而在 Java 中正则表达式中则需要有两个反斜杠才能被解析为其他语言中的转义作用。也可以简单的理解在 Java 的正则表达式中,两个 \\ 代表其他语言中的一个 \,这也就是为什么表示一位数字的正则表达式是 \\d,而表示一个普通的反斜杠是 \\\\。

2. 正则表达式使用的引擎

实现正则表达式匹配算法的叫做正则表达式引擎,正则表达式引擎有两种方式:DFA 自动机(Deterministic Final Automata 确定型有穷自动机)和 NFA 自动机(Non deterministic Finite Automaton 不确定型有穷自动机)。

Java 正则表达式使用的引擎实现是 NFA 自动机,这种正则表达式引擎在进行字符匹配时会发生回溯(backtracking)。而一旦发生回溯,那其消耗的时间就会变得很长,有可能是几分钟,也有可能是几个小时,时间长短取决于回溯的次数和复杂度。

方案:

1. 从这则表达的写法上减少回溯现象的发生;

2. 利用正则表达式的三种模式:贪婪模式、懒惰模式(追加"?"的方式,尽可能少的匹配但是仍然会发生回溯)、独占模式(追加“+”的方式,尽可能多的匹配,但是不回溯)。

备注:更为详细的讲解可参考:https://www.cnblogs.com/chanshuyi/p/the_regex_backtracking_trap.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值