Java正则表达式

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正则表达式命名组

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

定义命名组的格式为:

(?<groupName>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 = "(?<areaNumber>\\d{3})(?<prefixPhoneNumber>\\d{3})(?<postPhoneNumber>\\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 = "(?<areaNumber>\\d{3})(?<prefixPhoneNumber>\\d{3})(?<postPhoneNumber>\\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:1234567890
Area code start:0
Prefix start:3
Post Number start:6
Matched Text:9876543210
Area code start:23
Prefix start:26
Post Number start:29

 

posted @ 2017-11-28 10:10  起床oO  阅读(331)  评论(0编辑  收藏  举报