Java----正则表达式简单记录

2019-09-29  本文已影响0人  不过意局bugyj

Pattern

  1. pattern.matches(regex, text) 返回boolean对象,表示一个句子是否符合正则表达式!

  2. Pattern pattern = Pattern.compile(regex);
    Matcher matcher = pattern.matcher(text)
    

    其也有一个matches方法判断是否匹配!

  3. Pattern.split() 方法可以用正则表达式作为分隔符来断句。

    Pattern pattern = Pattern.compile(patternString);
    String[] split = pattern.split(text);
    
  4. Pattern.pattern()其实就是获取编译了的regrex!即compile方法的参数!

Matcher

java.util.regex.Matcher 类用于匹配一段文本中多次出现一个正则表达式,Matcher 也适用于多文本中匹配同一个正则表达式。构造方式:

String text    =
        "This is the text to be searched " +
        "for occurrences of the http:// pattern.";
String patternString = ".*http://.*";
Pattern pattern = Pattern.compile(patternString);
Matcher matcher = pattern.matcher(text);
  1. boolean matches = matcher.matches();

  2. lookingAt() 与matches() 方法类似,最大的不同是,lookingAt()方法对文本的开头匹配正则表达式;而

    matches() 对整个文本匹配正则表达式。

  3. find() + start() + end()

    find() 方法用于在文本中查找出现的正则表达式,文本是创建Matcher时,通过 Pattern.matcher(text) 方法传入的。如果在文本中多次匹配,find() 方法返回第一个,之后每次调用 find() 都会返回下一个

    start() 和 end() 返回每次匹配的字串在整个文本中的开始和结束位置。实际上, end() 返回的是字符串末尾的后一位,这样,可以在把 start() 和 end() 的返回值直接用在String.substring() 里。

  4. reset()

    reset() 方法会重置Matcher 内部的 匹配状态。当find() 方法开始匹配时,Matcher 内部会记录截至当前查找的距离。调用 reset() 会重新从文本开头查找。

    reset(CharSequence) 方法. 这个方法重置Matcher,同时把一个新的字符串作为参数传入,用于代替创建 Matcher 的原始字符串。

  5. group()

    假设想在一个文本中查找URL链接,并且想把找到的链接提取出来。当然可以通过 start()和 end()方法完成。但是用group()方法更容易些。

    使用group(int groupNo) 方法访问一个分组。一个正则表达式可以有多个分组。每个分组由一对括号标记。想要访问正则表达式中某分组匹配的文本,可以把分组编号传入 group(int groupNo)方法。

    group(0) 表示整个正则表达式,要获得一个有括号标记的分组,分组编号应该从1开始计算。

    ((John) (.+?))
    

    当遇到嵌套分组时, 分组编号是由左括号的顺序确定的。上例中,分组1 是那个大分组。分组2 是包括John的分组,分组3 是包括 .+? 的分组。当需要通过groups(int groupNo) 引用分组时,了解这些非常重要。

  6. replaceAll() + replaceFirst()

    replaceAll() 和 replaceFirst() 方法可以用于替换Matcher搜索字符串中的一部分。replaceAll() 方法替换全部匹配的正则表达式,replaceFirst() 只替换第一个匹配的。

    在处理之前,Matcher 会先reset()重置。所以这里的匹配表达式从文本开头开始计算。两个方法返回替换后的文本!

  7. appendReplacement() + appendTail()

    appendReplacement() 和 appendTail() 方法用于替换输入文本中的字符串短语,同时把替换后的字符串附加到一个 StringBuffer 中。

    当find() 方法找到一个匹配项时,可以调用 appendReplacement() 方法,这会导致输入字符串被增加到StringBuffer 中,而且匹配文本被替换。 从上一个匹配文本结尾处开始,直到本次匹配文本会被拷贝。

    appendReplacement() 会记录拷贝StringBuffer 中的内容,可以持续调用find(),直到没有匹配项。

    直到最后一个匹配项目,输入文本中剩余一部分没有拷贝到 StringBuffer. 这部分文本是从最后一个匹配项结尾,到文本末尾部分。通过调用 appendTail() 方法,可以把这部分内容拷贝到 StringBuffer 中.

    String text    =
              "John writes about this, and John Doe writes about that," +
                      " and John Wayne writes about everything."
            ;
    
    String patternString1 = "((John) (.+?)) ";
    Pattern      pattern      = Pattern.compile(patternString1);
    Matcher      matcher      = pattern.matcher(text);
    StringBuffer stringBuffer = new StringBuffer();
    
    while(matcher.find()){
        matcher.appendReplacement(stringBuffer, "Joe Blocks ");
        System.out.println(stringBuffer.toString());
    }
    matcher.appendTail(stringBuffer);
    System.out.println(stringBuffer.toString());
    

    注意我们在while循环中调用appendReplacement() 方法。在循环完毕后调用appendTail()。 代码输出如下:

    Joe Blocks
     Joe Blocks about this, and Joe Blocks
     Joe Blocks about this, and Joe Blocks writes about that, and Joe Blocks
     Joe Blocks about this, and Joe Blocks writes about that, and Joe Blocks
     writes about everything.
    

基本语法

. 匹配任意一个字符,根据创建Pattern是传入的标志,可能匹配行结尾符
\d 匹配任意数字 [0-9]
\D 匹配任意非数字 [^0-9]
\s 匹配任意空白符 (空格, 缩进, 换行,回车)
\S 匹配任意非空白符
\w 匹配任意单词
\W 匹配任意非单词

边界匹配

^ 匹配行首
$ 匹配行尾
\b 匹配单词边界
\B 匹配非单词边界
\A 匹配文本开头
\G 匹配前一匹配项结尾
\Z Matches the end of the input text except the final terminator if any
\z 匹配文本结尾

量词

上一篇下一篇

猜你喜欢

热点阅读