プログラム言語 正規表現

概要

通常の文字列判定(Perl)
fnMatchCheck("I Love Perl");
→マッチ
fnMatchCheck("I love perl");
→マッチしない
sub fnMatchCheck
{
  my $target = shift;
  if ($target eq "I Love Perl")
  {
    print "マッチ!","\n";
  }
}

正規表現を用いた判定(Perl)
fnMatchCheck("I Love Perl");
→マッチ
fnMatchCheck("I love perl");
→マッチ
sub fnMatchCheck
{
  my $target = shift;
  if ($target =~ /I [lL]ove [pP]erl/)
  {
    print "マッチ!","\n";
  }
}

基本形

using System.Text.RegularExpressions;

string[] strCheck = {
  @"C#", ⇒マッチ!
  @"c#",
  @"C",
  @"c",
  @"I Love C#", ⇒マッチ!
  @"VB.NET",
  @"Perl",
  @"abcde",
  @"abcC#de", ⇒マッチ!
  };

Regex myReg = new Regex(pattern: @"C#");

foreach (string elm in strCheck)
{
  //elm は "C#"を含むか?
  if (myReg.IsMatch(input: elm))
  {
    Console.WriteLine("マッチ!");
  }
}

@」はエスケープ処理防止
(「プログラム言語 変数/リテラル」参照)

文字列 =~ /検索語/
文字列 は 検索語 を含むか?

fnMatchCheck("I Love Perl");
→マッチ!

sub fnMatchCheck
{
  my $target = shift;
  # $target は Perl を含むか?
  if ($target =~ /Perl/)
  {
    print "マッチ!","\n";
  }
}

否定形
文字列 !~ /検索語/
文字列 は 検索語 を含まないか?

fnMatchCheck("I Love Perl");
→アンマッチ!

sub fnMatchCheck
{
  my $target = shift;
  # $target は Ruby を含まないか?
  if ($target !~ /Ruby/)
  {
    print "アンマッチ!","\n";
  }
}

正規表現

一覧

a*a

a、aa、9a、a9

表現 機能 使用例 結果
. 任意の1文字 a.a a9a、aaa
* 直前の1文字の0回以上の繰り返し
.* 直前の1文字の1回以上の繰り返し a.*a a99a、a9a、aaa、aa
+ 直前の1文字の1回以上の繰り返し a+a a99a、a9a、aa
? 直前の文字の0または1文字 a?a aaa、aa、9aa
^ 行の先頭 ^a aaa、aa、a9
$ 行の末尾 a$ aaa、aa、9a
[] カッコ内の任意の文字 [123]
[1-3]も可
a1、2a、a123b
[^] カッコ内の任意の文字以外 [^1-3] aa、9a
{n} n回繰り返し a{2} aa、aaa、9aa、aa9
{n,} n回以上繰り返し a{2,} aa、aaa、9aa、aa9
{n,m} n~m回繰り返し a{2,4} aa、aaa、aaaa、9aaa
~1|~2 ~1 または ~2 aa|99 aaa、a99、aab99
\ 直後の一文字を非正規表現として扱う \[、\?、\. [aa、a?、a.

メタキャラクタ

表現 機能
\w 英字 a~z、A~Z、_、1~9
\W 英字以外
\s 空白文字 半角スペース、タブ、改行、キャリッジリターン
\S 空白文字以外
\d 半角数字 0~9
\D 半角数字以外
\b 単語の境界

任意の一文字

[検索語]
検索語の中の一文字 を含むか?

string[] strCheck = {
  @"C#", ⇒マッチ!
  @"c#", ⇒マッチ!
  @"C", ⇒マッチ!
  @"c", ⇒マッチ!
  @"I Love C#", ⇒マッチ!
  @"VB.NET",
  @"Perl",
  @"abcde", ⇒マッチ!
  @"i love c#", ⇒マッチ!
  };

// elm は「c」か「C」を含むか?
Regex myReg = new Regex(pattern: @"[cC]");

foreach (string elm in strCheck)
{
  if (myReg.IsMatch(elm))
  {
    Console.WriteLine("マッチ!");
  }
}

文字列 =~ /[検索語]/
文字列 は 検索語の中の一文字 を含むか?

fnMatchCheck("I Love Perl");
→マッチ!
fnMatchCheck("I love perl");
→マッチ!

sub fnMatchCheck
{
  my $target = shift;
  # $target は p or P を含むか?
  if ($target =~ /[pP]/)
  {
    print "マッチ!","\n";
  }
}

任意の一文字(連続)
[ag]
⇒[abcdefg]

fnMatchCheck("c;);
→マッチ!

sub fnMatchCheck
{
  my $target = shift;
  # $target は abcdefg・・・vwxyz の中の一文字を含むか?
  if ($target =~ /[a-z]/)
  {
    print "マッチ!","\n";
  }
}

任意の一文字の否定
文字列 =~ /[^検索語]/
文字列 は 検索語の中の一文字 を含まないか?

fnMatchCheck("hijklmn");
→マッチ!

sub fnMatchCheck
{
  my $target = shift;

  # $target は abcdefg の中の一文字を含まないか?
  if ($target =~ /[^a-g]/)
  {
    print "マッチ!","\n";
  }
}

ワイルドカード(一文字)


何か一文字 を含むか?

string[] strCheck = {
  @"get", ⇒マッチ!
  @"gt",
  @"g",
  @"t",
  @"got", ⇒マッチ!
  @"ghost",
  @"I get pass" ⇒マッチ!
  };

// elm は 先頭「g」、間に何か一文字、末尾「t」の文字を含むか?
Regex myReg = new Regex(pattern: @"g.t");

foreach (string elm in strCheck)
{
  if (myReg.IsMatch(elm))
  {
    Console.WriteLine("マッチ!");
  }
}

文字列 =~ / ~~ /
文字列 は ~何か一文字~ を含むか?

fnMatchCheck("get");
→マッチ!
fnMatchCheck("ghost");
→マッチしない
fnMatchCheck("I’ve got a pass");
→マッチ!

sub fnMatchCheck
{
  my $target = shift;
  # $target は g(何か一文字)t を含むか?
  if ($target =~ /g.t/)
  {
    print "マッチ!","\n";
  }
}

量指定子

「?」(0個or1個)

string[] strCheck = {
  @"get", ⇒マッチ!
  @"gt", ⇒マッチ!
  @"g",
  @"t",
  @"got", ⇒マッチ!
  @"ghost",
  @"I get pass" ⇒マッチ!
  @"gto = great teacher onizuka"; ⇒マッチ!
  };

// elm は 先頭「g」、間に何か0文字or一文字、末尾「t」の文字を含むか?
Regex myReg = new Regex(pattern: @"g.?t");

foreach (string elm in strCheck)
{
  if (myReg.IsMatch(elm))
  {
    Console.WriteLine("マッチ!");
  }
}

文字列 =~ / ~? /
文字列 は ~を0文字か1文字 を含むか?

例:ab?
⇒「a」 または 「ab」にマッチ
例:a.?
⇒「a」 または 「ad」「ab」…「az」や、「a0」…「a9」にマッチ

fnMatchCheck("gt");
→マッチ!
fnMatchCheck("get");
→マッチ!
fnMatchCheck("ghost");
→マッチしない

sub fnMatchCheck
{
  my $target = shift;

  if ($target =~ /g.?t/)
  {
   # $target は g(何かの文字0文字か1文字)t を含むか?
    print "マッチ!","\n";
  }
}

「+」(1個以上)

string[] strCheck = {
  @"get", ⇒マッチ!
  @"gt",
  @"g",
  @"t",
  @"got", ⇒マッチ!
  @"ghost", ⇒マッチ!
  @"I get pass" ⇒マッチ!
  @"gto = great teacher onizuka";
  };

// elm は 先頭「g」、間に何か一文字以上、末尾「t」の文字を含むか?
Regex myReg = new Regex(pattern: @"g.+t");

foreach (string elm in strCheck)
{
  if (myReg.IsMatch(elm))
  {
    Console.WriteLine("マッチ!");
  }
}

文字列 =~ / ~+ /
文字列 は ~を1個以上 を含むか?

例:ab+
⇒「ab」「abb」「ab0」…にマッチ
例:a.+
⇒「aa」「ab」「abc」…にマッチ

fnMatchCheck("gt");
→マッチしない
fnMatchCheck("get");
→マッチ!
fnMatchCheck("ghost");
→マッチ!

sub fnMatchCheck
{
  my $target = shift;

  if ($target =~ /g.+t/)
  {
   # $target は g(何かの文字1個以上)t を含むか?
    print "マッチ!","\n";
  }
}

「*」(0個以上)

string[] strCheck = {
  @"get", ⇒マッチ!
  @"gt", ⇒マッチ!
  @"g",
  @"t",
  @"got", ⇒マッチ!
  @"ghost", ⇒マッチ!
  @"I get pass" ⇒マッチ!
  @"gto = great teacher onizuka"; ⇒マッチ!
  };

// elm は 先頭「g」、間に何か0文字以上、末尾「t」の文字を含むか?
Regex myReg = new Regex(pattern: @"g.*t");

foreach (string elm in strCheck)
{
  if (myReg.IsMatch(elm))
  {
    Console.WriteLine("マッチ!");
  }
}

文字列 =~ / ~* /
文字列 は ~を0文字以上 を含むか?

例:ab*
⇒「a」「ab」「abb」「ab0」…にマッチ
例:a.*
⇒「a」「aa」「ab」「abc」…にマッチ

fnMatchCheck("gt");
→マッチ!
fnMatchCheck("get");
→マッチ!
fnMatchCheck("ghost");
→マッチ!

sub fnMatchCheck
{
  my $target = shift;

  if ($target =~ /g.*t/)
  {
   # $target は g(何かの文字0個以上)t を含むか?
    print "マッチ!","\n";
  }
}

「{n}」(n個連続)
「{n,}」(n個以上連続)
「{n,m}」(n個以上m個以下連続)

string[] strCheck1 = {
  @"gt",
  @"get",
  @"geet",
  @"geeet" ⇒マッチ!,
  @"geeeet",
  @"g",
  @"t",
  @"ghost" ⇒マッチ!,
  @"I see ghost." ⇒マッチ!;
  };

// elm は 先頭「g」、間に何か三文字、末尾「t」の文字を含むか?
Regex myReg1 = new Regex(pattern: @"g.{3}t");

foreach (string elm in strCheck1)
{
  if (myReg1.IsMatch(elm))
  {
    Console.WriteLine("マッチ!");
  }
}

string[] strCheck2 = {
  @"gt",
  @"get", ⇒マッチ!
  @"geet", ⇒マッチ!
  @"geeet", ⇒マッチ!
  @"geeeet",
  @"g",
  @"t",
  @"ghost" ⇒マッチ!,
  @"I see ghost." ⇒マッチ!
  };

// elm は 先頭「g」、間に何か1~3文字、末尾「t」の文字を含むか?
Regex myReg2 = new Regex(pattern: @"g.{1,3}t");

foreach (string elm in strCheck2)
{
  if (myReg2.IsMatch(elm))
  {
    Console.WriteLine("マッチ!");
  }
}

string[] strCheck3 = {
  @"gt",
  @"get",
  @"geet",
  @"geeet", ⇒マッチ!
  @"geeeet", ⇒マッチ!
  @"g",
  @"t",
  @"ghost" ⇒マッチ!,
  @"I see ghost." ⇒マッチ!;
  };

// elm は 先頭「g」、間に何か三文字以上、末尾「t」の文字を含むか?
Regex myReg3 = new Regex(pattern: @"g.{3,}t");

foreach (string elm in strCheck3)
{
  if (myReg3.IsMatch(elm))
  {
    Console.WriteLine("マッチ!");
  }
}

文字列 =~ / ~{n} /
文字列 は ~をn個連続 を含むか?

例:ge{2}t
⇒「geet」にマッチ。get:×、gt:×

fnMatchCheck("get");
→マッチしない
fnMatchCheck("geet");
→マッチ!
fnMatchCheck("geeet");
→マッチしない

sub fnMatchCheck
{
  my $target = shift;

  if ($target =~ /ge{2}t/)
  {
    print "マッチ!","\n";
  }
}

位置指定子

「^」 先頭

例: "^\d"
"555" ○
"5aa" ○
"a55" ×

「$」 末尾

ただし、文字列の末尾が \n の時は、その前と一致。
(末尾が \n でも末尾で一致させるには、\z を使う。)

例: "\d$"
"555" ○
"aa5" ○
"55a" ×

代替構成体

①|②
①or②

置換

変数 =~ s/置換対象/置換後/;

my $s = "i love perl";
$s =~ s/i/I/;
⇒$s : I love perl

my $s = "I love perl";
$s =~ s/love/LOVE/;
$s =~ s/perl/PERL/;
⇒$s : I LOVE PERL

マッチした値の取得

if (文字列 =~ /(検索語)/)
{
  print "$1","\n";
  ⇒ 検索語
  # マッチした場合、検索語が$1に入る。
}

my $words_ref = [
  'papix loves meat!',
  'boolfool loves sushi!',
];

check($words_ref);

sub check
{
 my $str = shift;

 for my $elm (@$str)
 {
  if ($elm =~ /(.+) loves (.+)!/)
  {
   print "$1 => $2","\n";
   ⇒ papix => meat
   ⇒ boolfool => sushi
  }
 }
}

SQLでの利用

SQL DML:データ型/WHERE句における文字指定」参照