🎉

正規表現の最低限知識と、Javaでの正規表現チェック、 エスケープシーケンス

2023/08/14に公開

正規表現(regex)について

今日は正規表現の基礎知識について記述していきたいと思います。
それに伴い、エスケープシーケンスについても記述していきます。
そして、Javaにおける正規表現チェック(Pattern,Matcherクラス)まで書いていきます。

今回の記事の内容大枠としては、以下の内容!

  1. 正規表現とは?
  2. エスケープ文字、エスケープシーケンス
  3. 正規表現よく使用する基礎知識
  4. 豆知識: intelliJの正規表現確認機能
  5. javaでの正規表現API: Patternクラス、Matcherクラス

もし間違いや、補足点等あればコメントいただけると嬉しいです!(^^)/❤︎

恥ずかしかった話(笑)

というのも、つい最近の出来事ですが、、、
今まで正規表現に触れたことがなく、
調べて書いてもうまくいかねえなと思ったら、エスケープシーケンスというものもあると…。笑
これもあれも知らずで恥ずかしかったので、教えてもらったこと、勉強して使ったので、
こちらに基礎となる知識を、まとめていきます。

正規表現とは

英語: regular expression, regex

いくつかの文字列を一つの形式で表現するための表現方法。
"ある文字列が、指定の法則に従っているか"を判断するために使われるもの。
= “文字のパターンマッチングチェック”

正規表現の例

使用例

電話番号: 
090-1234-5678は表すと、、、
\d{3}-\d{4}-\d{4}

メールアドレス:
[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}
一般的なメールアドレスのパターンにマッチ。
例:
入力: "example@example.com"
マッチする部分: "example@example.com"

正規表現を書く上で、これは知っておきたかったな、、、のエスケープシーケンス!!!
先にエスケープシーケンスから記述します。

正規表現とエスケープ文字、エスケープシーケンス

エスケープ文字って出たり、エスケープシーケンスって出たり、、なんなんだ??

■ エスケープ文字?? エスケープシーケンス...?

・ エスケープ文字:
エスケープ文字は、エスケープシーケンス内で特別な意味を持つ文字。
これは通常、そのままの文字として表示されるのではなく、特別な操作や意味を示すために使用されます。
ex.) nは改行文字を表すエスケープ文字 / tはタブ文字を表すエスケープ文字

・ エスケープシーケンス:
通常特殊な意味を持つ文字や文字列を表すために使用される特別な文字の組み合わせ
バックスラッシュ(\)とその後に続く文字(エスケープ文字と呼ぶ)で構成される。
要するに...

\n これは改行を意味するが、この文字部分(n)をエスケープ文字と呼び、
そのエスケープ文字を、それ単体では特別な意味として働けないので、
意味のある"改行"という意味のある文字として認識させ働かせるために\をつける。
\n この組み合わせがエスケープシーケンス!!!

よく使用されるエスケープ文字

[よく使用される正規表現]

文字 意味
\n 改行
\f 改ページ
\\ \
\" "
\t タブ文字
\s スペース
\b バックスペース
\t 水平タブ
\t タブ文字
\s スペース

[文字の量指定子]

記号 意味
* 直前の文字が0回以上繰り返す。
+ 直前の文字が1回以上繰り返す。
? 直前の文字があるかないか。
{n} 直前の文字がちょうどn回繰り返す。
{n,} 直前の文字がn回以上繰り返す。
{n,m} 直前の文字がn回以上、m回以下繰り返す。

[特殊文字とエスケープ]

文字 意味
. 任意の1文字にマッチ。
[] 指定された文字のいずれかに一致。
[^] 指定された文字以外に一致。
() グループ化。
\ エスケープ文字。
\d 数字に一致。
\w 英数字に一致。
\s 空白文字に一致。

[位置指定子]

記号 意味
^ 行の先頭に一致。
$ 行の末尾に一致。
\b 単語の境界に一致。

. "なんでも(任意の)一文字"の、組み合わせとして...
何文字かわからないけど0文字以上!な時。こんなものがある!!

正規表現 意味
.* 0文字以上の任意の文字列
.+ 1文字以上の任意の文字列

1桁以上の数字だ、となったら、 \d.+このように組み合わせて記述可能。

他にもありますが、こんな感じかな?

エスケープ処理とは

"あれ, 数字って調べたら\dって書いてるのに、使う時\\d なんだけどこれ何...??"
"あれ、小数点書きたいのに....って任意のって意味もあるけど、どうするん...??"

このように、
特別な意味を打ち消して文字として認識させるような処理を
"エスケープ処理"という。

"小数点の.を表現したい"、なのにそれ単体だと上記のよく使うで出てきたように
"なんでも一文字"というエスケープ文字でもあります。

そんな時はエスケープ処理をする必要があるのです、

正規表現 意味
\ 機能をうつけす。Javaの文中においては\\

javaの文字列においては、その文字の前に打ち消しの意味のバックスラッシュを2本
\\.これで、特別な意味のドットではなく、小数点としてのドットに返信可能なのだ。

ところで、正規表現とエスケープシーケンスの違いは?

私は最初何だかこんがらがった。ので、説明をタブに加えます!!!

正規表現とエスケープシーケンスの違い

ここまでエスケープ文字(エスケープシーケンス)について説明見たら、
"エスケープシーケンスが正規表現...?"という疑問は湧かないだろうか??
(私は、初見時、そのように思いました。笑)

エスケープシーケンス:

特別な意味を持つ文字(例えば改行やタブ)を表現するための,特殊な文字の組み合わせ
ex.) \nは改行、\tはタブ

正規表現:

正規表現は、文字列の特定のパターンを見つけるために使用される特別な文字の組み合わせ
文字列の検索や操作に使われます。
例: \d は任意の数字を表し、[a-zA-Z]+ は英字の文字列を表します。

豆知識: intelliJでの正規表現確認機能

Pattern.compileメソッドのよう正規表現を受け取るメソッドの引数部分で、
[Alt]+[Enter] ([Option]+[Return])キーを押すと、
"正規表現の確認(CheckReg Exp)"や、"regExpフラグメントの編集(Edit RegExp Fragment)"
を含むメニューが表示されます。


intelliJ:ヒント

他) さまざまな正規表現確認ツール

以下のページにたくさんまとめられていたので、こちらの記事を参考に...!
メインではないので、ここでは省略いたします!!!
https://qiita.com/aqril_1132/items/c185c7ad84c129e5a2df 
https://qiita.com/aqril_1132/items/c185c7ad84c129e5a2df

Javaでの正規表現: Patternクラス / Matcherクラス

Javaでの正規表現は、java.util.regexパッケージにまとめられていて、
このパッケージ内のPatternクラスMatcherクラスを利用して一致しているのか確認が可能。

java.util.regexパッケージ

■ Patternクラス

Patternクラス:
正規表現パターンをコンパイルして、正規表現を効率的に扱うためのクラス

Javaでの正規表現チェックは、Pattern.compileメソッドで正規表現の解析が可能。

正規表現パターンをコンパイルしてPatternオブジェクトを生成。

String regex = "\\d+"; // 数字のパターン
Pattern pattern = Pattern.compile(regex);

Patternオブジェクトを使用して、文字列をマッチングさせることができる。

そのPatternオブジェクトに対して、matcherメソッドで文字列を渡すと、
文字列を解釈する過程を管理するMatherオブジェクトが得られる。

■ Matcherクラス

Matcherクラス:
Patternを解釈することによって、 文字シーケンスのマッチ操作を行うエンジン

Matcherオブジェクトを使用してマッチング結果を取得.

String regex = "\\d+"; // 数字のパターン
Pattern pattern = Pattern.compile(regex);

String text = "12345";
Matcher matcher = pattern.matcher(text);

if (matcher.matches()) {
    System.out.println("マッチしました");
} else {
    System.out.println("マッチしませんでした");
}

これで、文字列が数字のパターンにマッチするかどうかを判定しています。

<マッチング結果の利用>
Matcherオブジェクトを使って、マッチした部分文字列を取得できる。
find()メソッドを使うことで、文字列中のすべてのマッチを検出できる。

import java.util.regex.*;

public class PatternExample {
    public static void main(String[] args) {
        String regex = "\\d+"; // 数字のパターン
        Pattern pattern = Pattern.compile(regex);

        String text = "Hello 123 World";
        Matcher matcher = pattern.matcher(text);

        while (matcher.find()) {
            String matchedText = matcher.group(); // マッチした部分文字列
            System.out.println("マッチ: " + matchedText);
        }
    }
}

この例では、文字列中の数字にマッチする部分文字列を取得しています。

まとめ

Discussion