Java正则表达式的简单使用
来源:互联网 发布:新疆的网络受限 编辑:程序博客网 时间:2024/05/16 14:32
前言
Pattern
Pattern p = Pattern.compile("a*b")
Matcher m = p.matcher("aaaaab")
boolean b = m.matches()
boolean b = Pattern.matches("a*b", "aaaaab")
Matcher
Matcher matcher = pattern.matcher("abcd");
public static void main(String[] args) { Pattern pattern = Pattern.compile("(\\d+)"); Matcher matcher = pattern.matcher("123a4567b90d"); while (matcher.find()) { System.out.println(matcher.group(1)); System.out.println("匹配到的字符串开始索引:" + matcher.start()); System.out.println("匹配到的字符串结束索引:" + (matcher.end() - 1)); } }
123匹配到的字符串开始索引:0匹配到的字符串结束索引:24567匹配到的字符串开始索引:4匹配到的字符串结束索引:790匹配到的字符串开始索引:9匹配到的字符串结束索引:10
PatternSyntaxException
构造摘要
行结束符
行结束符 是一个或两个字符的序列,标记输入字符序列的行结尾。以下代码被识别为行结束符:新行(换行)符 ('\n')
后面紧跟新行符的回车符 ("\r\n")
单独的回车符 ('\r')
下一行字符 ('\u0085')
行分隔符 ('\u2028')
段落分隔符 ('\u2029)
如果指定 UNIX_LINES(?d)标志,则新行符('\n')是唯一识别的行结束符。
如果指定 DOTALL 标志,则正则表达式 . 可以与任何字符包括行结束符除外匹配。
默认情况下,正则表达式 ^ 和 $ 忽略行结束符,仅分别与整个输入序列的开头和结尾匹配。如果指定MULTILINE标志,则 ^ 在输入的开头和行结束符之后发生匹配,$ 在输入的结尾和行结束符之前匹配。
逻辑运算
字符
字符类别
预定义字符类别
边界匹配器
\B:不是\b的边界都属于\B,比如单词和单词的边界,符号和符号的边界。
这里的单词不是\w代表的0-9a-zA-Z_,我猜想应该是w的超集,包括比如汉字、希腊字母、英文字母、数字、下划线等等,符号可以是中文符号、英文符号、空格、制表符、换行符等等,更具体的包括哪些只能在实践中测试。参考下面的例子:
public static void main(String[] args) { String str = "(我(i ——\t_离"; String rex = "\\b"; Pattern pattern = Pattern.compile(rex); String[] result = pattern.split(str); for (String string : result) { System.out.println("分割的字符串:" + "[" + string + "]"); } }
分割的字符串:[(] 分割的字符串:[我] 分割的字符串:[(] 分割的字符串:[i] 分割的字符串:[ —— ] 分割的字符串:[_离]
public static void main(String[] args) { String str = "(我(i ——\t_离"; String rex = "\\B"; Pattern pattern = Pattern.compile(rex); String[] result = pattern.split(str); for (String string : result) { System.out.println("分割的字符串:" + "[" + string + "]"); } }
分割的字符串:[] 分割的字符串:[(我(i ] 分割的字符串:[—] 分割的字符串:[—] 分割的字符串:[ _] 分割的字符串:[离]
转义
捕获组
非捕获组
非捕获组,它只分组而不捕获文本,也就不占用分组编号,普通非捕获组的语法是(?:X),X是正则表达式构造。数量词
Greedy
X? X,一次或一次也没有X* X,零次或多次
X+ X,一次或多次
X{n} X,恰好 n 次
X{n,} X,至少 n 次
X{n,m} X,至少 n 次,但是不超过 m 次
public static void main(String[] args) { Pattern p = Pattern.compile(".{3,10}[0-9]"); String s = "abcd1efgh2"; Matcher m = p.matcher(s); if (m.find()) System.out.println(m.start() + "-" + m.end()); else System.out.println("没匹配"); }输出:0-10
解释:Greedy是尽量吃入后再吐出。这个表达式 {3,10}吃入最多字符的10个字符:abcd1efgh2。吃入之后后面的[0-9]发现没有匹配的,吐出最后一个字符看是数字结果匹配。
Reluctant
X?? X,一次或一次也没有
X*? X,零次或多次
X+? X,一次或多次
X{n}? X,恰好 n 次
X{n,}? X,至少 n 次
X{n,m}? X,至少 n 次,但是不超过 m 次
public static void main(String[] args) { Pattern p = Pattern.compile(".{3,10}?[0-9]"); String s = "abcd1efgh2"; Matcher m = p.matcher(s); if (m.find()) System.out.println(m.start() + "-" + m.end()); else System.out.println("没匹配"); }输出:0-5
解释:对于Reluctant 来说,就是Greedy的一个相反的匹配模式,他从左到有一个一个开始吃入,而不是整个字符串一个一个吐出。这个表达式{3,10}的吞入最少字符的3个字符:abc,吃入之后后面的[0-9]发现没有匹配的,再吃入1个字符后才有匹配。
Possessive
X?+ X,一次或一次也没有
X*+ X,零次或多次
X++ X,一次或多次
X{n}+ X,恰好 n 次
X{n,}+ X,至少 n 次
X{n,m}+ X,至少 n 次,但是不超过 m 次
public static void main(String[] args) { Pattern p = Pattern.compile(".{3,10}+[0-9]"); String s = "abcd1efgh2"; Matcher m = p.matcher(s); if (m.find()) System.out.println(m.start() + "-" + m.end()); else System.out.println("没匹配"); }输出:没匹配
它和greedy类似,也是全部吃入,但是唯一不同的是它不吐出。
先行断言和后行断言
先行断言和后行断言其实就是预测之后的字符和之前的字符,只有首先符合预测结果,才能继续匹配,在预测过程中,匹配的位置不会变化,所以被称为“零宽”。例如,预测a后面是bc,那么所有a后面是bc的字符串符合,接着正常匹配,匹配位置依然从a后面开始而不是从c开始。以下4种都属于特殊结构的非捕获组。
(?=pattern) 正向先行断言 :代表字符串中的一个位置,紧接该位置之后的字符序列能够匹配pattern。
例如:Pattern.matches("a(?=b)bc", "abc")返回true。
(?!pattern) 负向先行断言 :代表字符串中的一个位置,紧接该位置之后的字符序列不能匹配pattern。
例如:Pattern.matches("a(?!bcd)bc", "abc")返回true,Pattern.matches("a(?!bc)bc", "abc")返回false。
(?<=pattern) 正向后行断言 :代表字符串中的一个位置,紧接该位置之前的字符序列能够匹配pattern。
例如:Pattern.matches("a(?<=a)bc", "abc")返回true。
(?<!pattern) 负向后行断言 :代表字符串中的一个位置,紧接该位置之前的字符序列不能匹配pattern。
例如:Pattern.matches("a(?<!ab)bc", "abc")返回true,Pattern.matches("a(?<!a)bc", "abc")返回false。
开启关闭特殊标志
这里的标志就是Pattern类里的区分大小写、多行模式等。Pattern中大部分标志可以使用嵌入式字符串,也可以使用Pattern的常量进行设置。嵌入式字符串直接嵌入在正则表达式里,可以控制开启和关闭、是否捕获。标志前加“-”表示关闭。
(?idmsux-idmsux) :将开启或者关闭标志i d m s u x。
(?idmsux-idmsux:X):将开启或者关闭标志i d m s u x,仅对X有效,但是X是作为非捕获组。
例如:Pattern.matches("(?i)abc(?-i)abc", "aBCabc")返回true,Pattern.matches("(?i)abc(?-i)abc", "aBCaBc")返回false。
- Java中正则表达式的简单使用
- java正则表达式---简单的使用
- Java正则表达式的简单使用
- java 正则表达式的使用 超级简单
- java正则表达式简单使用
- 正则表达式的简单使用
- 正则表达式的简单使用
- 正则表达式的简单使用
- 正则表达式的简单使用
- 简单的Java正则表达式
- Java中怎么简单的使用正则表达式?
- java正则表达式(Regular Expression)简单使用
- java正则表达式的使用
- java正则表达式的使用
- java 正则表达式的使用
- java正则表达式的使用
- java 正则表达式的使用
- Java 正则表达式的使用
- C指针
- MySQL必知必会-4导入项目SQL脚本
- 【蓝桥】入门训练 Fibonacci数列
- html5在线编辑器效果和源码
- [LeetCode]91. Decode Ways
- Java正则表达式的简单使用
- hduoj1215
- UWP开发技巧:实现SMB协议操作文件服务器文件
- Codeforce#394E. Dasha and Puzzle(dfs)
- 迄今为止跑得最快的一次10公里
- 如何使用TortoiseSVN与VisualSVN Server搭建版本控制系统
- 03. Frog Jump
- WebService流行框架之Axis和CXF
- Vijos1327回文词