当前位置:

Java的正则表达式

访客 2024-01-05 1547 0

目录

定义1.主要的3个类2.使用正则表达式的两种办法快速查找表1.匹配符号2.元字符3.量词4.Groups组的使用5.综合上表的快速查找表常用应用实例(持续更新)1.表达式中与之匹配的常用方法例子2.邮箱地址3.Pattern类实例4.电话号码

定义

正则表达式定义了字符串的模式。正则表达式可以用来搜索、编辑或处理文本。正则表达式并不仅限于某一种语言,但是在每种语言中有细微的差别。Java的正则表示与Perl最为相似。在Java1.4中对String类进行了扩展,提供了一个可以进行regex模式匹配的方法。importjava.util.regex.*;

1.主要的3个类

-Pattern(模式):Pattern类没有任何公共构造函数,我们使用它的公共静态方法compile()通过传递正则表达式参数来创建Pattern对象。

Patternpattern=Pattern.compile(".xx.");

Pattern使用方法:https://pingfangx.github.io/java-tutorials/essential/regex/pattern.html

-Matcher(匹配):Matcher类没有任何公共构造函数,我们使用Pattern对象匹配方法得到一个Matcher对象,该方法将输入的字符串作为参数。然后我们使用matches()方法,根据输入的String是否与regex模式匹配,返回boolean结果。

Matchermatcher=pattern.matcher("MxxY");

Matcher使用方法:https://pingfangx.github.io/java-tutorials/essential/regex/matcher.html

-PatternSyntaxException(语法不正确异常):正则表达式语法不正确则会抛出该异常。

  • //错误语法用于测试异常
  • pattern=Pattern.compile("*xx*");
  • //输出
  • Exceptioninthread"main"java.util.regex.PatternSyntaxException:Danglingmetacharacter'*'nearindex0
  • *xx*
  • ^
  • atjava.util.regex.Pattern.error(Pattern.java:1924)
  • atjava.util.regex.Pattern.sequence(Pattern.java:2090)
  • atjava.util.regex.Pattern.expr(Pattern.java:1964)
  • atjava.util.regex.Pattern.compile(Pattern.java:1665)
  • atjava.util.regex.Pattern.(Pattern.java:1337)
  • atjava.util.regex.Pattern.compile(Pattern.java:1022)
  • atcom.journaldev.util.PatternExample.main(PatternExample.java:13)
  • PatternSyntaxException使用方法:PatternSyntaxException类的方法|JAVA8官网笔记教程

    2.使用正则表达式的两种办法

    复杂模式:可操作性更高,需要重复使用模式时使用。

  • importjava.util.regex.*;
  • publicclassPatternExample{
  • publicstaticvoidmain(String[]args){
  • Patternpattern=Pattern.compile(".xx.");
  • Matchermatcher=pattern.matcher("MxxY");
  • System.out.println("InputStringmatchesregex-"matcher.matches());
  • }
  • }
  • 简单模式:直接在String调用,简单的字符串匹配时使用,节省时间和代码行。

  • Stringstr="bbb";
  • System.out.println("UsingStringmatchesmethod:"str.matches(".bb"));
  • System.out.println("UsingPatternmatchesmethod:"Pattern.matches(".bb",str));
  • 快速查找表

    1.匹配符号

    符号描述例子.匹配任何单一字符(“…”,“a%”)–true(“…”,“.a”)–true(“…”,“a”)–false^aaa匹配行首以aaa开头的字符串

    (“^a.c.”,“abcd”)–true

    (“^a”,“ac”)–false

    aaa$匹配行末以aaa结尾的字符串

    (“…cd$”,“abcd”)–true

    (“a$”,“a”)–true

    (“a$”,“aca”)–false

    [abc]

    可以匹配任何一个字母a、b或c。

    []被称为字符类。[]表示范围。

    (“^[abc]d.”,“ad9”)–true

    (“[ab].d$”,“bad”)–true

    (“[ab]x”,“cx”)–false

    [abc][12]可以与a、b或c相匹配,后面是1或2

    (“[ab][12].”,“a2#”)–true

    (“[ab]…[12]”,“acd2”)–true

    (“[ab][12]”,“c2”)–false

    [^abc]

    当^是[]中的第一个字符时,它否定了模式,

    匹配除a、b或c之外的任何东西

    (“[^ab][^12].”,“c3#”)–true

    (“[^ab]…[^12]”,“xcd3”)–true

    (“[^ab][^12]”,“c2”)–false

    [a-e1-8]匹配a至e或1至8之间的范围

    (“[a-e1-3].”,“d#”)–true

    (“[a-e1-3]”,“2”)–true

    (“[a-e1-3]”,“f2”)–false

    xxyy匹配结果xx或yy无

    2.元字符

    常见的匹配模式中的元字符

    原元字符简略元字符描述[0-9]\d任何数字[^0-9]\D任何非数字[\t\n\x0B\f\r]\s任何空白字符[^/s]\S任何非空格字符[a-zA-Z_0-9]\w任何单词字符[^/w]\W任何非文字的字符无\b一个词的边界无\B一个非词的边界

    如何将表达式的字符(元字符)当做普通字符使用:

    1.在元字符前加一个反斜杠(\)。

    2.将元字符保持在\Q(开始引用)和\E(结束引用)之内。

    3.量词

    量词指定了要匹配的字符的出现次数。

    元字符描述x?x出现一次或0次(0/1次)X*X出现0次或多次XX*出现一次或多次(至少出现一次)X{n}X正好出现n次X{n,}X出现n或者比n更多的次数X{n,m}

    X出现的次数,在n次和m次之间,n和m包括

    4.Groups组的使用

    可以将多个元字符作为一个组使用,使用()创建一个组,使用双反斜杠数字表明使用哪个组。

  • System.out.println(Pattern.matches("(\\w\\d)\\1","a2a2"));//true
  • System.out.println(Pattern.matches("(\\w\\d)\\1","a2b2"));//false
  • System.out.println(Pattern.matches("(AB)(B\\d)\\2\\1","ABB2B2AB"));//true
  • System.out.println(Pattern.matches("(AB)(B\\d)\\2\\1","ABB2B3AB"));//false
  • 上述第一行例子:(\\w\\d)匹配"a2",(\\w\\d)为第一组表达式,\\1表示再使用一次第一组表达式,也就是"a2",最终加起来匹配到"a2a2"。第二行例子可以很好证明第一行中\\1的使用。

    第三行例子:(AB)为第一组表达式,匹配"AB"。(B\\d)为第二组表达式,匹配B任意数字。\\2表示再使用一次第二组表达式,也就是(B\\d),匹配B任意数字。\\1表示再使用一次第一组表达式,也就是(AB),匹配"AB"。用文字表达则是"ABB任意数字B任意数字AB"。与matchs第二个参数内的String:"ABB2B2AB"符合,返回true。第四行例子可以很好证明第三行。

    5.综合上表的快速查找表

    表达式

    描述

    a-z表示小写字母a到z中任一个A-Z表示大写字母A到Z中任一个[xxx]表示xxx集合内的字符[xxx]表示xxx集合内的字符,一个或更多个

    常用应用实例(持续更新)

    1.表达式中与之匹配的常用方法例子

  • importjava.util.regex.Matcher;
  • importjava.util.regex.Pattern;
  • publicclassRegexExamples{
  • publicstaticvoidmain(String[]args){
  • //usingpatternwithflags
  • Patternpattern=Pattern.compile("ab",Pattern.CASE_INSENSITIVE);
  • Matchermatcher=pattern.matcher("ABcabdAb");
  • //usingMatcherfind(),group(),start()andend()methods
  • while(matcher.find()){
  • System.out.println("Foundthetext\""matcher.group()
  • "\"startingat"matcher.start()
  • "indexandendingatindex"matcher.end());
  • }
  • //usingPatternsplit()method
  • pattern=Pattern.compile("\\W");
  • String[]words=pattern.split("one@two#three:four$five");
  • for(Strings:words){
  • System.out.println("SplitusingPattern.split():"s);
  • }
  • //usingMatcher.replaceFirst()andreplaceAll()methods
  • pattern=Pattern.compile("1*2");
  • matcher=pattern.matcher("11234512678");
  • System.out.println("UsingreplaceAll:"matcher.replaceAll("_"));
  • System.out.println("UsingreplaceFirst:"matcher.replaceFirst("_"));
  • System.out.println(Pattern.quote("^[_A-Za-z0-9-\\](\\.[_A-Za-z0-9-])*@[A-Za-z0-9-](\\.[A-Za-z0-9])*(\\.[A-Za-z]{2,})$"));
  • }
  • }
  • 2.邮箱地址

  • packagecom.journaldev.regex;
  • importjava.util.regex.Matcher;
  • importjava.util.regex.Pattern;
  • publicclassEmailValidator{
  • //Regexpatterntovalidemailaddress
  • privatestaticfinalStringEMAIL_REGEX="^[\\w-\\](\\.[\\w])*@[\\w-](\\.[\\w])*(\\.[a-z]{2,})$";
  • //staticPatternobject,sincepatternisfixed
  • privatestaticPatternpattern;
  • //non-staticMatcherobjectbecauseit'screatedfromtheinputString
  • privateMatchermatcher;
  • publicEmailValidator(){
  • //initializethePatternobject
  • pattern=Pattern.compile(EMAIL_REGEX,Pattern.CASE_INSENSITIVE);
  • }
  • /**
  • *ThismethodvalidatestheinputemailaddresswithEMAIL_REGEXpattern
  • *@paramemail
  • *@returnboolean
  • */
  • publicbooleanvalidateEmail(Stringemail){
  • matcher=pattern.matcher(email);
  • returnmatcher.matches();
  • }
  • }
  • 测试用例

  • packagecom.journaldev.regex;
  • publicclassEmailValidatorTest{
  • //listofvalidemailaddresses
  • privatestaticfinalString[]validEmailIds=newString[]{"journaldev@yahoo.com",
  • "journaldev-100@yahoo.com","journaldev.100@yahoo.com",
  • "journaldev111@journaldev.com","journaldev-100@journaldev.net",
  • "journaldev.100@journaldev.com.au","journaldev@1.com",
  • "journaldev@gmail.com.com","journaldev100@gmail.com",
  • "journaldev-100@yahoo-test.com","journaldev_100@yahoo-test.ABC.CoM"};
  • //listofinvalidemailaddresses
  • privatestaticfinalString[]invalidEmailIds=newString[]{"journaldev","journaldev@.com.my",
  • "journaldev123@gmail.a","journaldev123@.com","journaldev123@.com.com",
  • ".journaldev@journaldev.com","journaldev()*@gmail.com","journaldev@%*.com",
  • "journaldev..2002@gmail.com","journaldev.@gmail.com",
  • "journaldev@journaldev@gmail.com","journaldev@gmail.com.1a"};
  • privatestaticEmailValidatoremailValidator;
  • publicstaticvoidmain(Stringargs[]){
  • emailValidator=newEmailValidator();
  • for(Stringtemp:validEmailIds){
  • booleanvalid=emailValidator.validateEmail(temp);
  • System.out.println("EmailID"temp"isvalid?"valid);
  • }
  • System.out.println("\n\n");
  • for(Stringtemp:invalidEmailIds){
  • booleanvalid=emailValidator.validateEmail(temp);
  • System.out.println("EmailID"temp"isvalid?"valid);
  • }
  • }
  • }
  • 3.Pattern类实例

  • importjava.util.regex.*;
  • publicclassPatternExample{
  • publicstaticvoidmain(String[]args)throwsInterruptedException{
  • //Patternpattern=Pattern.compile(".xx.");
  • //Matchermatcher=pattern.matcher("MxxY");
  • //System.out.println("InputStringmatchesregex-"matcher.matches());
  • //badregularexpression
  • //Thread.sleep(100);
  • //pattern=Pattern.compile("*xx*");
  • //Stringstr="bbb";
  • //System.out.println("UsingStringmatchesmethod:"str.matches(".bb"));
  • //System.out.println("UsingPatternmatchesmethod:"Pattern.matches(".bb",str));
  • //System.out.println(Pattern.matches("ad.$","ade"));
  • //System.out.println(Pattern.matches("^d.","ada"));
  • //System.out.println(Pattern.matches("d.","da"));
  • //System.out.println(Pattern.matches("[ab]x","cx"));
  • //System.out.println(Pattern.matches("^[abc]d.","ad9"));
  • //System.out.println(Pattern.matches("[ab].d$","bad"));
  • //System.out.println(Pattern.matches("[ab]x","cx"));
  • //System.out.println(Pattern.matches("..",".a"));
  • //System.out.println(Pattern.matches("[ab][12].","a2#"));
  • //System.out.println(Pattern.matches("[ab]..[12]","acd2"));
  • //System.out.println(Pattern.matches("[ab][12]","c2"));
  • //System.out.println(Pattern.matches("[^ab][^12].","c3#"));
  • //System.out.println(Pattern.matches("[^ab]..[^12]","xcd3"));
  • //System.out.println(Pattern.matches("[^ab][^12]","c2"));
  • //System.out.println(Pattern.matches("[a-e1-3].","d#"));
  • //System.out.println(Pattern.matches("[a-e1-3]","2"));
  • //System.out.println(Pattern.matches("[a-e1-3]","f2"));
  • //System.out.println(Pattern.matches("x.|y","xa"));
  • //System.out.println(Pattern.matches("x.|y","y"));
  • //System.out.println(Pattern.matches("x.|y","yz"));
  • //System.out.println(Pattern.matches("[a-zA-Z_0-9]","9"));
  • System.out.println(Pattern.matches("(\\w\\d)\\1","a2a2"));//true
  • System.out.println(Pattern.matches("(\\w\\d)\\1","a2b2"));//false
  • System.out.println(Pattern.matches("(AB)(B\\d)\\2\\1","ABB2B2AB"));//true
  • System.out.println(Pattern.matches("(AB)(B\\d)\\2\\1","ABB2B3AB"));//false
  • }
  • }
  • 4.电话号码

  • publicclassPhoneNumberValidator{
  • publicstaticvoidmain(String[]args){
  • System.out.println("Phonenumber1234567890validationresult:"validatePhoneNumber("1234567890"));
  • System.out.println("Phonenumber123-456-7890validationresult:"validatePhoneNumber("123-456-7890"));
  • System.out.println("Phonenumber123-456-7890x1234validationresult:"validatePhoneNumber("123-456-7890x1234"));
  • System.out.println("Phonenumber123-456-7890ext1234validationresult:"validatePhoneNumber("123-456-7890ext1234"));
  • System.out.println("Phonenumber(123)-456-7890validationresult:"validatePhoneNumber("(123)-456-7890"));
  • System.out.println("Phonenumber123.456.7890validationresult:"validatePhoneNumber("123.456.7890"));
  • System.out.println("Phonenumber1234567890validationresult:"validatePhoneNumber("1234567890"));
  • }
  • privatestaticbooleanvalidatePhoneNumber(StringphoneNo){
  • //validatephonenumbersofformat"1234567890"
  • if(phoneNo.matches("\\d{10}"))returntrue;
  • //validatingphonenumberwith-,.orspaces
  • elseif(phoneNo.matches("\\d{3}[-\\.\\s]\\d{3}[-\\.\\s]\\d{4}"))returntrue;
  • //validatingphonenumberwithextensionlengthfrom3to5
  • elseif(phoneNo.matches("\\d{3}-\\d{3}-\\d{4}\\s(x|(ext))\\d{3,5}"))returntrue;
  • //validatingphonenumberwhereareacodeisinbraces()
  • elseif(phoneNo.matches("\\(\\d{3}\\)-\\d{3}-\\d{4}"))returntrue;
  • //returnfalseifnothingmatchestheinput
  • elsereturnfalse;
  • }
  • }
  • 参考文章:

    1.RegularExpressioninJava-JavaRegexExample|DigitalOcean

    发表评论

    • 评论列表
    还没有人评论,快来抢沙发吧~