トップへ(mam-mam.net/)

正規表現(TRegExでマッチ,置換)の使い方 ~Delphiソースコード集

検索:

正規表現(TRegExでマッチ,置換)の使い方 ~Delphiソースコード集

TRegExを使うとDelphiで正規表現を扱うことができます。
TRegExを使うには
uses System.RegularExpressions;
が必要です。

大文字小文字を区別しないで正規表現にマッチ(一致)するか調べる

'delphi'の文字列が、大文字小文字を区別しない正規表現'[A-Z]'にマッチするかどうかを調べる。

uses System.RegularExpressions;

procedure TForm1.Button1Click(Sender: TObject);
var opt:TRegExOptions;
begin
  //大文字小文字を区別しないオプションを設定する
  opt:=[roSingleLine,roIgnoreCase];
  if TRegEx.IsMatch('delphi','[A-Z]',opt) then
    Memo1.Lines.Add('マッチする')
  else
    Memo1.Lines.Add('マッチしない')
end;

「マッチする」が出力される

大文字小文字を区別して正規表現にマッチ(一致)するか調べる

'delphi'の文字列が、大文字小文字を区別する正規表現'[A-Z]'にマッチするかどうかを調べる。

uses System.RegularExpressions;

procedure TForm1.Button2Click(Sender: TObject);
var opt:TRegExOptions;
begin
  //大文字小文字を区別する
  opt:=[roSingleLine];
  if TRegEx.IsMatch('delphi','[A-Z]',opt) then
    Memo1.Lines.Add('マッチする')
  else
    Memo1.Lines.Add('マッチしない');
end;

「マッチしない」が出力される

正規表現にマッチ(一致)した箇所の文字列を出力する

'<p>あ</p><a>い</a><p>う</p><a>えお</a>'の文字列が、 正規表現'<p>.*?</p>'にマッチした箇所の文字列を出力する。

uses System.RegularExpressions;

procedure TForm1.Button3Click(Sender: TObject);
var opt:TRegExOptions;
    mm:TMatchCollection;
    m:TMatch;
begin
  //大文字小文字を区別しないオプションを設定する
  opt:=[roSingleLine,roIgnoreCase];
  mm:=TRegEx.Matches(
    '<p>あ</p><a>い</a><p>う</p><a>えお</a>',
    '<p>.*?</p>',
    opt
  );
  for m in mm do
    Memo1.Lines.Add(m.Value);
end;

「<p>あ</p>
<p>う</p>」
が出力される

正規表現にマッチ(一致)した箇所の丸括弧を使ったグループの文字列を出力する

'<p>あ</p><a>い<br>うえ</a><p>おか</p><a>きくけ<br>こ</a>'の文字列が、 正規表現'<a>(.*?)<br>(.*?)</a>'にマッチした箇所のグループの文字列を出力する。

uses System.RegularExpressions;

procedure TForm1.Button4Click(Sender: TObject);
var opt:TRegExOptions;
    mm:TMatchCollection;
    m:TMatch;
    i:integer;
begin
  //大文字小文字を区別しないオプションを設定する
  opt:=[roSingleLine,roIgnoreCase];
  mm:=TRegEx.Matches(
    '<p>あ</p><a>い<br>うえ</a><p>おか</p><a>きくけ<br>こ</a>',
    '<a>(.*?)<br>(.*?)</a>',
    opt
  );
  for m in mm do
    for i:=1 to m.Groups.Count-1 do
      Memo1.Lines.Add(m.Groups.Item[i].Value);
end;

「い
うえ
きくけ
こ」
が出力される

正規表現にマッチ(一致)した文字列を置換する

文字列 '<p>あ</p><a>い</a><p>う</p>' の 正規表現'<.*?>'にマッチした箇所を''(何もない文字列)に置換する(削除する)。

uses System.RegularExpressions;
procedure TForm1.Button5Click(Sender: TObject);
var opt:TRegExOptions;
begin
  opt:=[roSingleLine];
  Memo1.Lines.Add(
    TRegEx.Replace(
      '<p>あ</p><a>い</a><p>う</p>',
      '<.*?>',
      '',
      opt
    )
  );
end;

「あいう」が出力される

主な正規表現一覧

メタ文字 意味 備考
^ 先頭にマッチ
(例)先頭「ab」にマッチしないのでFalseを返す
TRegEx.IsMatch('zabc', '^ab')
(例)先頭「za」にマッチするのでTrueを返す
TRegEx.IsMatch('zabc', '^za')
(例)先頭「/za」にマッチするのでTrueを返す
TRegEx.IsMatch('/zabc', '^/za' )
$ 最後にマッチ
(例)最後「ab」にマッチしないのでFalseを返す
TRegEx.IsMatch('zabc', 'ab$')
(例)最後「bc」にマッチするのでTrueを返す
TRegEx.IsMatch('zabc', 'bc$')
. 任意の1文字
(例)「bcde」にマッチするのでTrueを返す
TRegEx.IsMatch('abcdef', 'b.de')
(例)マッチしないのでFalseを返す
TRegEx.IsMatch('abcdef', 'a.de$')
* 直前のパターンの0回以上繰り返し(最長一致)
(例)「bccc」にマッチするのでTrueを返す
TRegEx.IsMatch('abccc', 'bc*')
*? 直前のパターンの0回以上繰り返し(最短一致)
(例) 「b」にマッチするのでTrueを返す
TRegEx.IsMatch('abccc', 'bc*?')
+ 直前のパターンの1回以上繰り返し(最長一致)
(例)「bccc」にマッチするのでTrueを返す
TRegEx.IsMatch('abccc', 'bc+')
+? 直前のパターンの1回以上繰り返し(最短一致)
(例)「bc」にマッチするのでTrueを返す
TRegEx.IsMatch('abccc', 'bc+?')
? 直前のパターンの0~1回繰り返し(最長一致)
(例)「bc」にマッチするのでTrueを返す
TRegEx.IsMatch('abccc', 'bc?')
?? 直前のパターンの0~1回繰り返し(最短一致)
(例)「b」にマッチするのでTrueを返す
TRegEx.IsMatch('abccc', 'bc??')
| 又は
(例)「c」と「d」にマッチするのでTrueを返す
TRegEx.IsMatch('abcdef', 'c|d')
(例)「ab」「de」にマッチするのでTrueを返す
TRegEx.IsMatch('abcdef', 'ab|de')
[] []内の文字何れか [abc]は文字「abc」の何れか
[a-z]は文字「aからz」までの何れか
[c-g]は文字「cdefg」の何れか
[A-Z]は文字「AからZ」までの何れか
[0-9]は文字「0から9」までの何れか
[a-zA-Z0-9]は文字「aからz」「AからZ」「0から9」までの何れか
[ぁ-ん]は「ひらがな」の何れか
[ァ-ヴ]は「カタカナ」の何れか
[ヲ-゚]は「半角カタカナ」の何れか
(例)「def」にマッチするのでTrueを返す
TRegEx.IsMatch('abcdef', '[bcd]ef')
(例)「def」にマッチするのでTrueを返す
TRegEx.IsMatch('abcdef', '[a-zA-Z0-9]ef')
(例)マッチしないのでFalseを返す
TRegEx.IsMatch('abcdef', '[0-9]ef')
[^] []内に含まれない文字の何れか
(例)「bcde」にマッチするのでTrueを返す
TRegEx.IsMatch('abcdef', 'b[^xyz]de')
(例)マッチしないのでFalseを返す
TRegEx.IsMatch('abcdef', '[^a-zA-Z0-9]de')
(例)「def」にマッチするのでTrueを返す
TRegEx.IsMatch('abcdef', '[^0-9]ef')
\n ラインフィーダ(LF)
Linuxでの改行文字
(例)「LF」にマッチするのでTrueを返す
TRegEx.IsMatch('abc'+#13+#10+'def', '\n')
\r キャリッジリターン(CR)
(例)「CR」「LF」(Windowsの改行)にマッチするのでTrueを返す
TRegEx.IsMatch('abc'+#13+#10+'def', '\r\n')
\文字 \(バックスラッシュ)の直後の文字をエスケープする
(例)「\\」(バックスラッシュ)にマッチするのでTrueを返す
TRegEx.IsMatch('abc\\def', '\\\\')
\t タブ(0x09)
(例)「タブ」にマッチするのでTrueを返す
TRegEx.IsMatch('abc'+#9+'def', '\t')
\s 半角スペース、\t、\n、\r、\f の何れか
(例)「タブ」「スペース」にマッチするのでTrueを返す
TRegEx.IsMatch('abc'+#9+' def', '\s+')
\S 半角スペース、\t、\n、\r、\f 以外
(例)「abc」と「def」にマッチするのでTrueを返す
TRegEx.IsMatch('abc'+#9+' def', '\S+')
\d 半角数字 [0-9]と同じ
(例)「c789」にマッチするのでTrueを返す
TRegEx.IsMatch('abc789def', 'c\d+')
\D 半角数字以外の文字 [^0-9]と同じ
(例)マッチしないのでFalseを返す
TRegEx.IsMatch('abc789def', 'c\D+')
\w 半角英数字とアンダースコア(_)
(例)「c789_dEF」にマッチするのでTrueを返す
TRegEx.IsMatch('abc789_dEF#', 'c\w+')
\W 半角英数字とアンダースコア(_)以外の文字
(例)「c#」にマッチするのでTrueを返す
TRegEx.IsMatch('abc#DEF', 'c\W+')
{num} 直前パターンのnum回繰り返し
(例)「cde」にマッチするのでTrueを返す
TRegEx.IsMatch('abcdefgh', '[c-f]{3}')
(例)郵便番号「654-0101」にマッチするのでTrueを返す
TRegEx.IsMatch('654-0101', '^\d{3}-\d{4}$')
{min,} 直前パターンのmin回以上の繰り返し(最長一致)
(例)「cdefff」にマッチするのでTrueを返す
TRegEx.IsMatch('abcdefffgh', '[c-f]{3,}')
{min,}? 直前パターンのmin回以上の繰り返し(最短一致)
(例)「cde」にマッチするのでTrueを返す
TRegEx.IsMatch('abcdefffgh', '[c-f]{3,}?')
{min,max} 直前パターンのmin回以上、max回以下の繰り返し(最長一致)
(例)「cdeff」にマッチするのでTrueを返す
TRegEx.IsMatch('abcdefffgh', '[c-f]{3,5}')
(例)年月日「2024/01/05」にマッチするのでTrueを返す
TRegEx.IsMatch('2024/01/05', '^\d{4}\/\d{1,2}\/\d{1,2}$')
{min,max}? 直前パターンのmin回以上、max回以下の繰り返し(最短一致)
(例)「cde」にマッチするのでTrueを返す
TRegEx.IsMatch('abcdefffgh', '[c-f]{3,5}?')
^(?!.*文字列).*$ 文字列を含まない
(例)文字列「cde」を含んでいるのでFalseを返す
TRegEx.IsMatch('abcdefffgh', '^(?!.*cde).*$')
TRegEx.IsMatch('abcde', '^(?!.*cde).*$')
TRegEx.IsMatch('cdefffgh', '^(?!.*cde).*$')
(例)文字列「cde」を含まないのでTrueを返す
TRegEx.IsMatch('abcdfeffgh', '^(?!.*cde).*$')