Javaの正規表現の例

 

文字

説明

\

次の文字は特殊文字、テキスト、後方参照または8進数のエスケープとしてマークされています。例えば、「N」の文字「N」にマッチします。「\ N」は改行文字にマッチします。シーケンス "\\" マッチ "\"、 "\\(" マッチ "("。

^

入力文字列の開始位置と一致します。設定した場合、  正規表現の  オブジェクト  複数行の  プロパティ、また^「\ n」または「\ R」マッチ後の位置。

$

文字列の入力端の位置にマッチします。あなたは、設定した場合  のRegExp  オブジェクトの  複数行の  プロパティを、また$「\ n」または「\ rを」試合前の位置。

*

0回以上は前の文字または部分式にマッチします。例えば、ZO *「Z」と「動物園」にマッチします。* {0}に等しいです。

+

直前の文字または部分式を照合するための1つまたは複数回。例えば、「ZO +」と「ZO」と「動物園」マッチが、「Z」に一致しません。+ {1}と等価です。

ゼロまたは1つは、前の文字または部分式にマッチします。たとえば、「(複数可)のか?」「ん」または「やる」の「い」にマッチします。?{0,1}と同等です。

{ N }

nは 負でない整数です。完全一致  のn  回。一致していないが、「O」の試合で二つの「食品」「O」において、例えば、「O {2}」と「ボブ」。

{ N }

nは 負でない整数です。少なくともマッチング  のn 倍。例えば"O"で、 "O {2}"ミスマッチ"ボブ"、および内のすべてのO "foooood"と一致。"O- {1}" "O +"に相当します。"O {0}" "* O"に相当します。

{ NM }

M  及び  nは  非負整数である  N  <=  M少なくともマッチング  N  せいぜい倍  のM  倍。例えば、最初の三つのOで"O {1,3}、"マッチング"fooooood"。「O {0,1}に相当する'O?'。注:コンマと数字の間にスペースを挿入することはできません。

場合は、この文字直ちに他の修飾子(*、+、?、{ N- }、{ N-、}、{ N-M })その後、パターンマッチングである場合、 "非貪欲" 「非貪欲」パターンマッチングが可能に短い文字列を検索するには、デフォルト「貪欲」パターンマッチングが可能に長い文字列を検索します。例えば、で、文字列「OOOO」「+ oは?」一つだけの「o」をマッチし、「O +」のすべての「O」と一致します。

「R \ nは\」である以外の任意の1文字に一致します。そのような「[\ S \ S]」等の使用モードを含む「R \ n \」を含む任意の文字にマッチします。

パターン

マッチング  パターン  とマッチのキャプチャ部分式。あなたは使用することができます  $ 0 ... $ 9  プロパティは、キャプチャをマッチングのセットを取得するには、「マッチング」に起因します。括弧文字()、使用することを"\("または一致させるには"\)。"

(:?パターン

マッチング  パターンの  サブ式をしかし、それはない試合で、後で使用するために店に、非キャプチャ試合であることを、試合をキャプチャしません。この使用「または」文字|モードが有用であるとき、コンポーネントの組み合わせ()。たとえば、:|「産学(?Y IES)が表現より経済産業|産業の比率です」。

(?= パターン

順方向予測部分式最初の検索を実行する、発現がマッチに一致する  パターン  文字列の文字列開始点。これは、後で使用するために試合をキャプチャしていない非キャプチャ試合、です。たとえば、 'のWindows(= 95?| 98 | NT | 2000年)' 試合の"Windows"の"Windows 2000"が、 "Windowsの3.1"の"Windows"に一致していません。マッチが発生した後、ある文字、前の試合の後、すぐに検索のための次の試合ではなく、最初の文字の後の予測の構成を取ることはありません先読み。

(?!パターン

部分式は、式が一致していないと一致する逆先読み検索、実行  パターン  点列検索文字列を開始します。これは、後で使用するために試合をキャプチャしていない非キャプチャ試合、です。たとえば、 'Windowsの(95 | ?! 98 | NT | 2000年)' マッチング"のWindows 3.1"の"WindowsのWindows"の"Windows 2000 "が、一致していません""。マッチが発生した後、ある文字、前の試合の後、すぐに検索のための次の試合ではなく、最初の文字の後の予測の構成を取ることはありません先読み。

X |

マッチは、  xは  または  Y例えば、「Z |食品」とが一致する「Z」または「食品」。'(Z | f)はOOD'マッチ"zood"や"食べ物"。

[ XYZ ]

文字セット。付属の任意の文字と一致します。たとえば、「[abc]は、」「普通」が「」に一致します。

[^ XYZ ]

リバース文字セット。含まれていない任意の文字がマッチします。例えば、 "[^ ABC]" マッチ "P" で "普通"、 "L"、 "i" は、 "N"。

[ AZ ]

文字の範囲。指定された範囲内の任意の文字と一致します。例えば、「[AZ]」マッチ「」小文字のいずれかに「Z」の範囲。

[^ AZ ]

文字のリバース範囲。ない指定された範囲内の任意の文字と一致します。たとえば、「[^ AZ]」と一致していない「」「Z」の範囲内の任意の文字に。

\ B

、単語とスペースとの間の位置で単語の境界にマッチします。例えば、「ER \ B」一致「決して」「えー」ではなく、「ER」の「動詞」に一致していません。

\ B

非単語境界マッチング。「ER \ B」マッチ「ER」の「動詞」が、「決して」「ER」でと一致しません。

\ C X

マッチは、  xは  制御文字が示されました。例えば、\ CMはコントロール- Mまたはキャリッジリターンを一致します。X  の値は、AZまたはAZの間でなければなりません。ない場合は、cは、「C」の文字そのものであるとします。

\ dは

数字が一致します。これは、[0-9]と等価です。

\ D

数字以外の文字が一致します。これは[^ 0-9]と同じです。

\ F

他のマッチング改ページで。x0cと\ CL \に相当します。

\ nは

改行試合。X0Aと\ cJの\に相当します。

\ rを

キャリッジリターンをマッチング。\ x0dと\ CMに等価。

\ sの

その上、スペース、タブ、改ページを含む、任意の空白文字にマッチします。そして[\ F \ n \ R \ T \ V]と等価。

\ S

任意の非空白文字にマッチします。そして[^ \ F \ nは\ rを\トン\ V]と同等。

\トン

タブが一致します。そして、\ x09のと\ cIリ同等。

\ V

垂直タブが一致します。そして\ X0Bと\ CK相当。

\ワット

Characterクラスは、アンダースコアを含む任意の文字に一致します。そして、 "[A-ZA-Z0-9_]" と同等。

\ W

任意の非単語文字と一致します。そして、 "[^ A-ZA-Z0-9_]" と同等。

\ X N

マッチング  Nここで、  N  進数のエスケープコードです。進エスケープコードは正確に2桁である必要があります。たとえば、 "\ X41"マッチング"A"。"\ x041"と"\ X04" & "1"と同等。これは、正規表現でASCIIコードを使用することができます。

\ A

匹配 num,此处的 num 是一个正整数。到捕获匹配的反向引用。例如,"(.)\1"匹配两个连续的相同字符。

\n

标识一个八进制转义码或反向引用。如果 \n 前面至少有 n 个捕获子表达式,那么 n 是反向引用。否则,如果 n是八进制数 (0-7),那么 n 是八进制转义码。

\nm

标识一个八进制转义码或反向引用。如果 \nm 前面至少有 nm 个捕获子表达式,那么 nm 是反向引用。如果 \nm前面至少有 n 个捕获,则 n 是反向引用,后面跟有字符 m。如果两种前面的情况都不存在,则 \nm 匹配八进制值nm,其中 和 m 是八进制数字 (0-7)。

\nml

当 n 是八进制数 (0-3),m 和 l 是八进制数 (0-7) 时,匹配八进制转义码 nml

\un

匹配 n,其中 n 是以四位十六进制数表示的 Unicode 字符。例如,\u00A9 匹配版权符号 (©)。

package niuke;

import java.util.regex.Pattern;

public class MeituanTest1 {
    public static void main(String[] args) {

//        test1();
//        test2();
//        test3();
//        test4();
//        test5();
//        test6();
//        test7();
//          test8();
        test9();
    }

    //字符串中\代表转义,在正在表达式中\\相当于字符串中的一个\
    public static void test1(){
        String str="\\";
//        String patternStr="^x\\w*@tal\\w*\\.\\w*";
        String patternStr="\\\\";
        boolean result = Pattern.matches(patternStr, str);
        if (result) {
            System.out.println("字符串"+str+"匹配模式"+patternStr+"成功");
        }
        else{
            System.out.println("字符串"+str+"匹配模式"+patternStr+"失败");
        }
    }


    //正则式是最简单的能准确匹配一个给定String的模式,
    // 模式与要匹配的文本是等价的.静态的Pattern.matches方法
    // 用于比较一个String是否匹配一个给定模式.例程如下:
    public static void test2(){
        String str="java";
        String patternStr="java";
        boolean result = Pattern.matches(patternStr, str);
        if (result) {
            System.out.println("字符串"+str+"匹配模式"+patternStr+"成功");
        }
        else{
            System.out.println("字符串"+str+"匹配模式"+patternStr+"失败");
        }
    }


    //匹配连续多个字符
    public static void test3(){
        String str="jaaav";
        String patternStr="j(a*)v";
        boolean result = Pattern.matches(patternStr, str);
        if (result) {
            System.out.println("字符串"+str+"匹配模式"+patternStr+"成功");
        }
        else{
            System.out.println("字符串"+str+"匹配模式"+patternStr+"失败");
        }
    }

    //方括号中只允许的单个字符,模式“b[aeiou]n”指定,
    // 只有以b开头,n结尾,中间是a,e,i,o,u中任意一个的才能匹配上,
    // 所以数组的前五个可以匹配,后两个元素无法匹配.
    //方括号[]表示只有其中指定的字符才能匹配.
    public static void test4(){
        String[] dataArr = { "ban", "ben", "bin", "bon" ,"bun","byn","baen"};
        for (String str : dataArr) {
            String patternStr="b[aeiou]n";
            boolean result = Pattern.matches(patternStr, str);
            if (result) {
                System.out.println("字符串"+str+"匹配模式"+patternStr+"成功");
            }
            else{
                System.out.println("字符串"+str+"匹配模式"+patternStr+"失败");
            }
        }
    }

    //如果需要匹配多个字符,那么[]就不能用上了,
    // 这里我们可以用()加上|来代替,()表示一组,|表示或的关系,
    // 模式b(ee|ea|oo)n就能匹配been,bean,boon等.
    //    因此前三个能匹配上,而后两个不能.
    public static void test5(){
        String[] dataArr = { "been", "bean", "boon", "buin" ,"bynn"};
        for (String str : dataArr) {
            String patternStr="b(ee|ea|oo)n";
            boolean result = Pattern.matches(patternStr, str);
            if (result) {
                System.out.println("字符串"+str+"匹配模式"+patternStr+"成功");
            }
            else{
                System.out.println("字符串"+str+"匹配模式"+patternStr+"失败");
            }
        }
    }

    //String类的split函数支持正则表达式,上例中模式能匹配”,”,
    // 单个空格,”;”中的一个,split函数能把它们中任意一个当作分隔符,
    // 将一个字符串劈分成字符串数组.
    public static void test6(){
        String str="薪水,职位 姓名;年龄 性别";
        String[] dataArr =str.split("[,\\s;]");
        for (String strTmp : dataArr) {
            System.out.println(strTmp);
        }
    }

    public static void test7(){
        String[] dataArr = { "google", "gooogle", "gooooogle", "goooooogle","ggle"};
        for (String str : dataArr) {
            String patternStr = "g(o{2,5})gle";
            boolean result = Pattern.matches(patternStr, str);
            if (result) {
                System.out.println("字符串" + str + "匹配模式" + patternStr + "成功");
            } else {
                System.out.println("字符串" + str + "匹配模式" + patternStr + "失败");
            }
        }
    }


    public static void test8(){
        String[] dataArr = { "Tan", "Tbn", "Tcn", "Ton","Twn"};
        for (String str : dataArr) {
            String regex = "T[a-c]n";
            boolean result = Pattern.matches(regex, str);
            if (result) {
                System.out.println("字符串" + str + "匹配模式" + regex + "成功");
            } else {
                System.out.println("字符串" + str + "匹配模式" + regex + "失败");
            }
        }
    }

    //匹配以x开头包含@tal和.的字符串
    public static void test9(){
        String str="[email protected]";
        String patternStr="^x\\w*(@tal)\\w*\\.\\w*";
        boolean result = Pattern.matches(patternStr, str);
        if (result) {
            System.out.println("字符串"+str+"匹配模式"+patternStr+"成功");
        }
        else{
            System.out.println("字符串"+str+"匹配模式"+patternStr+"失败");
        }
    }
    
}

实际例子:

一行log:

121.56.62.86 - z.m.tv.sohu.com [29/May/2019:14:52:59  0800] "jsonlog={"atype":"apps","channelid":"315","cv":"7.2.0","enterid":"0","imei":"865939038074368","mfo":"vivo","mfov":"vivo Y67A","mos":"android","mosv":"6.0","msg":"imp","mtype":"6","passport":"","pro":"1","sim":"1","startid":"1559111507899","tkey":"4ff95d6e341645c9ce550d3908c130289a70a3e8","uid":"bcfefc656480478864ed429caf0fddaa","vids":[{"catecode":"101154;101147","datatype":2,"idx":"0002","mdu":"0004","memo":"{\"from_page\":\"1\",\"abmod\":\"\"}","pg":"61000","playlistid":9096123,"scn":"02","site":1,"time":1559111502980,"vid":2849803},{"catecode":"101154;101147","datatype":2,"idx":"0003","mdu":"0004","memo":"{\"from_page\":\"1\",\"abmod\":\"\"}","pg":"61000","playlistid":9096123,"scn":"02","site":1,"time":1559111502980,"vid":2849806},{"catecode":"101154;101147","datatype":2,"idx":"0004","mdu":"0004","memo":"{\"from_page\":\"1\",\"abmod\":\"\"}","pg":"61000","playlistid":9096123,"scn":"02","site":1,"time":1559111502980,"vid":2851842},{"catecode":"101154;101147","datatype":2,"idx":"0005","mdu":"0004","memo":"{\"from_page\":\"1\",\"abmod\":\"\"}","pg":"61000","playlistid":9096123,"scn":"02","site":1,"time":1559111502981,"vid":2851846},{"catecode":"101154;101147","datatype":2,"idx":"0006","mdu":"0004","memo":"{\"from_page\":\"1\",\"abmod\":\"\"}","pg":"61000","playlistid":9096123,"scn":"02","site":1,"time":1559111502981,"vid":2853761},{"catecode":"101154;101147","datatype":2,"idx":"0007","mdu":"0004","memo":"{\"from_page\":\"1\",\"abmod\":\"\"}","pg":"61000","playlistid":9096123,"scn":"02","site":1,"time":1559111502981,"vid":2853764},{"catecode":"101154;101147","datatype":2,"idx":"0001","mdu":"0002","memo":"{\"from_page\":\"1\",\"abmod\":\"\"}","pg":"61000","playlistid":9096124,"scn":"02","site":1,"time":1559111502982,"vid":2843185},{"catecode":"101154;101147","datatype":2,"idx":"0002","mdu":"0002","memo":"{\"from_page\":\"1\",\"abmod\":\"\"}","pg":"61000","playlistid":9096124,"scn":"02","site":1,"time":1559111502982,"vid":2843182},{"catecode":"101109","datatype":2,"idx":"0003","mdu":"0002","memo":"{\"from_page\":\"1\",\"abmod\":\"\"}","pg":"61000","playlistid":9098247,"scn":"02","site":1,"time":1559111502982,"vid":2887825},{"catecode":"101154;101147","datatype":2,"idx":"0001","mdu":"0004","memo":"{\"from_page\":\"1\",\"abmod\":\"\"}","pg":"61000","playlistid":9096123,"scn":"02","site":1,"time":1559111507927,"vid":2847533},{"catecode":"101154;101147","datatype":2,"idx":"0008","mdu":"0004","memo":"{\"from_page\":\"1\",\"abmod\":\"\"}","pg":"61000","playlistid":9096123,"scn":"02","site":1,"time":1559112778890,"vid":2854747}],"webtype":"WiFi"}" 204 0 "okhttp/3.12.2"
正则:
private static Pattern pattern = Pattern
    .compile("^([0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}.*) - .* \\[(.*)\\] \"jsonlog=(.*)\" [0-9]{3} [0-9]{1,5} \"(.*)\"$");

 

 

发布了159 篇原创文章 · 获赞 75 · 访问量 19万+

おすすめ

転載: blog.csdn.net/xuehuagongzi000/article/details/78007650