ExpressoRegexBuddy
正则表达式中有前瞻(Lookahead)和后顾(Lookbehind)的概念,这两个术语非常形象的描述了正则引擎的匹配行为。需要注意一点,正则表达式中的前和后和我们一般理解的前后有点不同。一段文本,我们一般习惯把文本开头的方向称作“前面”,文本末尾方向称为“后面”。但是对于正则表达式引擎来说,因为它是从文本头部向尾部开始解析的(可以通过正则选项控制解析方向),因此对于文本尾部方向,称为“前”,因为这个时候,正则引擎还没走到那块,而对文本头部方向,则称为“后”,因为正则引擎已经走过了那一块地方。
所谓的前瞻就是在正则表达式匹配到某个字符的时候,往“尚未解析过的文本”预先看一下,看是不是符合/不符合匹配模式,而后顾,就是在正则引擎已经匹配过的文本看看是不是符合/不符合匹配模式。符合和不符合特定匹配模式我们又称为肯定式匹配和否定式匹配。
现代高级正则表达式引擎一般都支持都支持前瞻,对于后顾支持并不是很广泛。
使用小括号指定一个子表达式后,匹配这个子表达式的文本(也就是此分组捕获的内容)可以在表达式或其它程序中作进一步的处理。默认情况下,每个捕获组会自动拥有一个组号,规则是:从左向右,以分组的左括号为标志,第一个出现的分组的组号为1,第二个为2,以此类推。
也可以自己指定子表达式的组名。这样在表达式或程序中可以直接引用组名,当然也可以继续使用组号。但如果正则表达式中同时存在普通捕获组和命名捕获组,那么捕获组的编号就要特别注意,编号的规则是先对普通捕获组进行编号,再对命名捕获组进行编号。
非捕获组只匹配结果,但不捕获结果,也不会分配组号,当然也不能在表达式和程序中做进一步处理。 首先(?:pattern)与(pattern)不同之处只是在于不捕获结果。 接下来的四个非捕获组用于匹配pattern(或者不匹配pattern)位置之前(或之后)的内容。匹配的结果不包括pattern。 例如: (?<=<(\w+)>).*(?=</\1>)匹配不包含属性的简单HTML标签内的内容。如:<div>hello</div>之中的hello,匹配结果不包括前缀<div>和后缀</div>。
java.util.regex是一个用正则表达式所订制的模式来对字符串进行匹配工作的类库包。 它包括两个类:Pattern和Matcher。 Pattern是一个正则表达式编译后在内存中的表现形式。 正则表达式字符串必须先被编译为Pattern对象,然后再利用该Pattern对象创建对应的Matcher对象。执行匹配所涉及的状态保留在Matcher对象中,多个Match对象可共享同一个Pattern对象 Matcher对象是一个状态机器,它依据Pattern对象做为匹配模式对字符串展开匹配检查。 典型的调用程序如下:
import java.util.regex.Pattern //将一个字符串编译成Pattern对象 Pattern p = Pattern.compile("a*b"); //使用Pattern对象创建Matcher对象 Matcher m = p.matcher("aaaaab"); boolean b = m.matches();上面定义的Pattern对象可以多次重复使用。如果某个正则表达式仅需一次使用,则可用Pattern类的静态matches方法,此方法自动把指定字条串编译成匿名的Pattern对象,并执行匹配
boolean b = Pattern.matches("a*b", "aaaaab");Pattern是不可变类,可供多个并发线程安全使用。
Matcher类提供了如下几个常用方法:
find()返回目标字符串中是否包含与Pattern匹配的子串 group():返回上一次与Pattern匹配的子串start():返回上一次与Pattern匹配的子串在目标字符串中的开始位置end():返回上一次与Pattern匹配的子串在目标字符串中的结束位置加1lookingAt():返回目标字符串起始部分与Pattern是否匹配matches():返回整个目标字符串与Pattern是否匹配,完全匹配才返回truereset():将现有的Matcher对象应用于一个新的字符序列通过Matcher类的find()和group()方法从目标字符串中依次取出特定子串:
//创建一个Pattern对象,并用它建立一个Matcher对象 Matcher m = Pattern.compile("\\w+").matcher("Java is very easy!"); while(m.find()){ System.out.println(m.group()); } int i = 0; //find()方法可以传入一个int类型的参数,从该int索引处向下搜索 while(m.find(i)){ System.out.print(m.group() + "\t"); i++; } //start()和end()方法主要用于确定子串在目标字符串中的位置 while(m.find()){ System.out.println(m.group() + "子串的起始位置:" + m.start() + ",其结束位置" + m.end()); } //reset()将现有的Matcher对象应用于新的字符序列 Pattern p = Pattern.compile("\\w+"); Matcher m = Pattern.matcher("King"); m.reset("Yes");String提供了如下几个特殊的方法
boolean matches(String regex):判断该字符串是否匹配指定的正则表达式String replaceAll(String regex, String replacement):将该字符串中所有匹配regex的子串替换成replacement。String replaceFirst(String regex, String replacement):将该字符串中第一个匹配regex的子串替换成replacement。String[] split(String regex):以regex作为分隔符,把该字符串分割成多个子串。转载于:https://www.cnblogs.com/kinglearnjava/p/4883412.html
相关资源:正则表达式_数字的提取