Javase Personal Trash Review Notes 09 Java正規表現

Java正規表現
文字列は実際には単純な正規表現です。たとえば、Hello World正規表現は「Hello World」文字列と一致します。

。(ドット)も正規表現であり、「a」や「1」などの任意の文字に一致します。

java.util.regexパッケージには、主に次の3つのカテゴリが含まれています。

パターンクラス:
パターンオブジェクトは、正規表現のコンパイルされた表現です。Patternクラスにはパブリックコンストラクターがありません。Patternオブジェクトを作成するには、最初に、Patternオブジェクトを返すパブリックの静的コンパイルメソッドを呼び出す必要があります。このメソッドは、最初のパラメーターとして正規表現を受け入れます。

Matcherクラス:
Matcherオブジェクトは、入力文字列を解釈および照合するためのエンジンです。Patternクラスと同様に、Matcherにはパブリックコンストラクターがありません。Matcherオブジェクトを取得するには、Patternオブジェクトのmatcherメソッドを呼び出す必要があります。

PatternSyntaxException:
PatternSyntaxExceptionは必須ではない例外クラスで、正規表現パターンの構文エラーを表します。
次の例では正規表現が使用されています。runoob。は、文字列にrunoobサブ文字列が含まれているかどうかを確認するために使用されます。

import java.util.regex.*;
 
class RegexExample1{
    
    
   public static void main(String args[]){
    
    
      String content = "I am noob " +
        "from runoob.com.";
 
      String pattern = ".*runoob.*";
 
      boolean isMatch = Pattern.matches(pattern, content);
      System.out.println("字符串中是否包含了 'runoob' 子字符串? " + isMatch);
   }
}
/*实例输出结果为:

字符串中是否包含了 'runoob' 子字符串? true

正規表現の構文
他の言語では、\は、正規表現に通常の(リテラル)バックスラッシュを挿入することを意味します。特別な意味を付けないでください。
Javaでは、\は、正規表現にバックスラッシュを挿入したいので、その後の文字に特別な意味があることを意味します。

キャラクター

説明

\

次の文字を特殊文字、テキスト、後方参照、または8進エスケープ文字としてマークします。たとえば、「n」は文字「n」と一致します。「\ n」は改行文字と一致します。シーケンス "\\" match "\"、 "\(" match "("。

^

入力文字列の先頭の位置と一致します。RegExpオブジェクトのMultilineプロパティが設定されている場合、^は「\ n」または「\ r」の後の位置にも一致します。

ドル

入力文字列の末尾の位置と一致します。RegExpオブジェクトのMultilineプロパティが設定されている場合、$は「\ n」または「\ r」の前の位置にも一致します。

直前の文字または部分式に0回以上一致します。たとえば、zo *は「z」と「zoo」に一致します。* {0、}と同等です。

直前の文字または部分式に1回以上一致します。たとえば、「zo +」は「zo」および「zoo」と一致しますが、「z」とは一致しません。+ {1、}と同等です。

直前の文字または部分式に0回または1回一致します。たとえば、「do(es)?」は「does」の「do」または「do」に一致します。?{0,1}に相当します。

{n}

nは負でない整数です。正確にn回一致します。たとえば、「o {2}」は「Bob」の「o」とは一致しませんが、「food」の2つの「o」とは一致します。

{n、}

nは負でない整数です。少なくともn回一致します。たとえば、「o {2、}」は「Bob」の「o」とは一致しませんが、「foooood」のすべてのoとは一致します。「o {1、}」は「o +」と同等です。「o {0、}」は「o *」と同等です。

{n、m}

mとnは負でない整数で、n <= mです。少なくともn回、最大でm回一致します。たとえば、「o {1,3}」は「fooooood」の最初の3つのoに一致します。「o {0,1}」は「o?」と同等です。注:コンマと数字の間にスペースを挿入することはできません。

この文字が他の修飾子(*、+、?、{n}、{n、}、{n、m})の直後に続く場合、マッチングモードは「貪欲でない」です。「貪欲でない」パターンは、検索された文字列にできるだけ一致しますが、デフォルトの「貪欲」パターンは、検索された文字列にできるだけ一致します。たとえば、文字列「oooo」では、「o +?」は単一の「o」にのみ一致し、「o +」はすべての「o」に一致します。

「\ r \ n」を除く任意の1文字に一致します。「\ r \ n」を含む任意の文字に一致させるには、「[\ s \ S]」などのパターンを使用します。

(パターン)

パターンを一致させ、一致した部分式をキャプチャします。$ 0 ... $ 9属性を使用して、結果の「一致」セットからキャプチャされた一致を取得できます。大括弧文字()に一致させるには、「(」または「)」を使用します。

(?:パターン)

パターンに一致しますが、一致した部分式はキャプチャしません。つまり、非キャプチャ一致であり、後で使用するために一致を保存しません。これは、パターンパーツを「または」文字(|)と組み合わせるときに便利です。たとえば、「industr(?:y | ies)」は「industry | industries」よりも経済的な表現です。

(?=パターン)

文字列一致パターンの先頭の文字列に一致する前方予測先読み検索の部分式を実行します。これは非キャプチャーマッチです。つまり、後で使用するためにキャプチャーできないマッチです。たとえば、「Windows(?= 95 | 98 | NT | 2000)」は、「Windows 2000」の「Windows」と一致しますが、「Windows 3.1」の「Windows」とは一致しません。最初の予測は文字を占有しません。つまり、一致が発生した後、次の一致の検索は、最初に予測を構成する文字の後ではなく、直前の一致の直後に行われます。

(?!パターン)

パターンに一致する文字列の開始点にない検索文字列に一致する後方予測先読み検索を実行する部分式。これは非キャプチャーマッチです。つまり、後で使用するためにキャプチャーできないマッチです。たとえば、「Windows(?!95 | 98 | NT | 2000)」は、「Windows 3.1」の「Windows」と一致しますが、「Windows 2000」の「Windows」とは一致しません。最初の予測は文字を占有しません。つまり、一致が発生した後、次の一致の検索は、最初に予測を構成する文字の後ではなく、直前の一致の直後に行われます。

x | y

xまたはyに一致します。たとえば、「z | food」は「z」または「food」に一致します。「(z | f)ood」は「zood」または「food」に一致します。

[xyz]

キャラクターセット。含まれている任意の文字に一致します。たとえば、「[abc]」は「plain」の「a」と一致します。

[^ xyz]

文字セットを反転します。含まれていない任意の文字に一致します。たとえば、「[^ abc]」は「プレーン」の「p」、「l」、「i」、「n」に一致します。

[az]

文字範囲。指定された範囲内の任意の文字に一致します。たとえば、 "[az]"は、 "a"から "z"の範囲のすべての小文字に一致します。

[^ az]

範囲文字を反転します。指定された範囲にない任意の文字に一致します。たとえば、「[^ az]」は、「a」から「z」の範囲にない任意の文字に一致します。

\ b

単語の境界、つまり単語とスペースの間の位置に一致しますたとえば、「er \ b」は「never」の「er」と一致しますが、「verb」の「er」とは一致しません。

\ B

非単語境界マッチング。「Er \ B」は「動詞」の「er」と一致しますが、「never」の「er」とは一致しません。

\ cx

xで示される制御文字と一致します。たとえば、\ cMはControl-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 \ t \ v]と同じです。

\ t

タブマッチ。\ x09および\ cIと同等。

\ v

垂直タブマッチング。\ x0bおよび\ cKと同等です。

\ w

アンダースコアを含む任意の単語文字に一致します。「[A-Za-z0-9_]」と同等です。

\ W

単語以外の文字と一致します。「[^ A-Za-z0-9_]」と同等です。

\ xn

nに一致します。nは16進数のエスケープコードです。16進数のエスケープコードは、正確に2桁でなければなりません。たとえば、「\ x41」は「A」と一致します。「\ x041」は「\ x04」&「1」と同等です。正規表現ではASCIIコードを使用できます。

\ 1つ

numに一致します。numは正の整数です。一致する後方参照をキャプチャします。たとえば、「(。)\ 1」は2つの連続する同一の文字に一致します。

\ n

8進数のエスケープコードまたは後方参照を識別します。\ nの前に少なくともn個のキャプチャ部分式がある場合、nは後方参照です。それ以外の場合、nが8進数(0〜7)の場合、nは8進数のエスケープコードです。

\ nm

8進数のエスケープコードまたは後方参照を識別します。\ nmの前に少なくともnm個のキャプチャ部分式がある場合、nmは後方参照です。\ nmの前に少なくともn個のキャプチャがある場合、nは後方参照であり、その後に文字mが続きます。上記の条件のいずれも存在しない場合、\ nmは8進数値nmに一致します。nおよびmは8進数(0〜7)です。

\ nml

nが8進数(0〜3)、mおよびlが8進数(0〜7)の場合、8進数のエスケープコードnmlと一致します。

\ a

nに一致します。nは、4桁の16進数で表されるUnicode文字です。たとえば、\ u00A9は著作権記号(©)と一致します。

Javaで正規表現を書く方法


  1. 1に一致します。1)実装方法1、数値に一致します。
public void regex1() {
    
    

        //要匹配的字符

        String str = "8";

        //正则表达式

        String regex = "[0-9]";

        //返回匹配的结果,匹配成功就返回true,失败就返回false,此次匹配返回true。

        boolean flag = Pattern.matches(regex, str);

        System.out.println(flag);

}

2)。実装方法2、3と5を含む大文字と小文字のない3〜5文字に一致します。

public void regex2() {
    
    

    //要匹配的字符

    String str = "hello";

    //正则表达式

    String regex = "[a-zA-Z]{3,5}";

    //输出匹配的结果, 此次匹配返回true。

    System.out.println(str.matches(regex));

}

3)。実装3(この実装は最速です)、11桁の電話番号のマッチング、ルールのマッチング:最初の数字は1、2番目の数字は2、3、7、8、および次の9のいずれかです。 4は数字に含まれていません。

public void regex3() {
    
    

    //要匹配的字符

    String str = "13656231253";

    //正则表达式

    String regex = "1[2378][0-35-9]{9}";

    //将给定的正则表达式编译为模式。 如果匹配需求较多,且需用同相同的regex去匹配,就可将这句写到静态模块里面,用的时候直接使用实例p

    Pattern p = Pattern.compile(regex);

    //创建一个匹配器,匹配给定的输入与此模式。

    Matcher m = p.matcher(str);

    //尝试将整个区域与模式进行匹配。

    boolean flag = m.matches();

    //输出匹配结果,此次结果为true

    System.out.println(flag);

}


  1. 交換してください。
public void regexReplace () {
    
    

    //要匹配的字符

    String str = "12a6B985Ccv65";

    //正则表达式

    String regex = "[a-zA-Z]+";

    //正则表达式

    String regex2 = "\\d+";

    //将字符串中英文字母替换为&符号,输出12&6&985&65

    System.out.println(str.replaceAll(regex, "&"));

    //将字符串中单个数字或者连续的数字替换为0,输出0a0B0Ccv0

    System.out.println(str.replaceAll(regex2,"0"));

}
  1. カット、大文字に従って文字列をカットします。
public void outputStr() {
    
    

    String str = "oneTtowTthreeDfourJfive";

    String regex = "[A-Z]";

    String[] arr = str.split(regex);

    for (String s: arr) {
    
    

    System.out.print(s + " ");

    }

}

输出:one tow three four five

startメソッド
次は、入力文字列内の単語「cat」の出現回数をカウントする例です。

import java.util.regex.Matcher;
import java.util.regex.Pattern;
 
public class RegexMatches
{
    
    
    private static final String REGEX = "\\bcat\\b";
    private static final String INPUT =
                                    "cat cat cat cattie cat";
 
    public static void main( String args[] ){
    
    
       Pattern p = Pattern.compile(REGEX);
       Matcher m = p.matcher(INPUT); // 获取 matcher 对象
       int count = 0;
 
       while(m.find()) {
    
    
         count++;
         System.out.println("Match number "+count);
         System.out.println("start(): "+m.start());
         System.out.println("end(): "+m.end());
      }
   }
}
/*以上实例编译运行结果如下:

Match number 1
start(): 0
end(): 3
Match number 2
start(): 4
end(): 7
Match number 3
start(): 8
end(): 11
Match number 4
start(): 19
end(): 22

matchesメソッドとlookingAtメソッド
は、入力シーケンスパターンとの一致を試みるために使用されます。それらの違いは、matchingはシーケンス全体が一致する必要があるのに対し、lookingAtはそうではないということです。
lookingAtメソッドは文全体と一致する必要はありませんが、最初の文字から一致する必要があります。

これら2つの方法は、入力文字列の先頭でよく使用されます。

次の例を使用して、この機能を説明します。

import java.util.regex.Matcher;
import java.util.regex.Pattern;
 
public class RegexMatches
{
    
    
    private static final String REGEX = "foo";
    private static final String INPUT = "fooooooooooooooooo";
    private static final String INPUT2 = "ooooofoooooooooooo";
    private static Pattern pattern;
    private static Matcher matcher;
    private static Matcher matcher2;
 
    public static void main( String args[] ){
    
    
       pattern = Pattern.compile(REGEX);
       matcher = pattern.matcher(INPUT);
       matcher2 = pattern.matcher(INPUT2);
 
       System.out.println("Current REGEX is: "+REGEX);
       System.out.println("Current INPUT is: "+INPUT);
       System.out.println("Current INPUT2 is: "+INPUT2);
 
 
       System.out.println("lookingAt(): "+matcher.lookingAt());
       System.out.println("matches(): "+matcher.matches());
       System.out.println("lookingAt(): "+matcher2.lookingAt());
   }
}
/*以上实例编译运行结果如下:

Current REGEX is: foo
Current INPUT is: fooooooooooooooooo
Current INPUT2 is: ooooofoooooooooooo
lookingAt(): true
matches(): false
lookingAt(): false

replaceFirstメソッドとreplaceAllメソッドreplaceFirstメソッド
とreplaceAllメソッドは、正規表現に一致するテキストを置き換えるために使用されます。違いは、replaceFirstが最初の一致を置き換え、replaceAllがすべての一致を置き換えることです。

次の例は、この機能を説明しています。

import java.util.regex.Matcher;
import java.util.regex.Pattern;
 
public class RegexMatches
{
    
    
    private static String REGEX = "dog";
    private static String INPUT = "The dog says meow. " +
                                    "All dogs say meow.";
    private static String REPLACE = "cat";
 
    public static void main(String[] args) {
    
    
       Pattern p = Pattern.compile(REGEX);
       // get a matcher object
       Matcher m = p.matcher(INPUT); 
       INPUT = m.replaceAll(REPLACE);
       System.out.println(INPUT);
   }
}

appendReplacementメソッドとappendTailメソッド
Matcherクラスは、テキスト置換のためのappendReplacementメソッドとappendTailメソッドも提供します。

この機能を説明するには、次の例を参照してください。

import java.util.regex.Matcher;
import java.util.regex.Pattern;
 
public class RegexMatches
{
    
    
   private static String REGEX = "a*b";
   private static String INPUT = "aabfooaabfooabfoobkkk";
   private static String REPLACE = "-";
   public static void main(String[] args) {
    
    
      Pattern p = Pattern.compile(REGEX);
      // 获取 matcher 对象
      Matcher m = p.matcher(INPUT);
      StringBuffer sb = new StringBuffer();
      while(m.find()){
    
    
         m.appendReplacement(sb,REPLACE);
      }
      m.appendTail(sb);
      System.out.println(sb.toString());
   }
}
/*以上实例编译运行结果如下:

-foo-foo-foo-kkk


上記のコード交換部分に特に感謝します
著者:Vic_is_new_Here
リンク:https://www.jianshu.com/p/3c076c6b2dc8
出典:Jane Books

おすすめ

転載: blog.csdn.net/qq_45864370/article/details/108551823