正規表現 (regexp)

正規表現の基本的な使い方と、一致した全文字列や部分文字列の取得。

C言語

#include <stdio.h>  // puts
#include <string.h> // strncpy
#include <regex.h>  // regcomp, regex

// マッチした部分文字列を出力
void print(const char *str, int so, int eo)
{
	char tmp[7];

	str += so;             // マッチ先頭
	eo -= so;              // マッチ長さ
	strncpy(tmp, str, eo); // マッチ部分を tmp へ
	tmp[eo] = '\0';
	puts(tmp);
}

int main()  
{  
	regex_t regst;
	regmatch_t match[3];

	char *reg = "(abc)(def)";   // 正規表現例
	char *str = "xxxabcdefxxx"; //マッチ対象文字列例

	if (regcomp(&regst, reg, REG_EXTENDED)) {     // 事前にコンパイル
		return 1;
	}
	if (!regexec(&regst, str, 3, match, 0)) {  // マッチ
		print(str, match[0].rm_so, match[0].rm_eo); // マッチ全体 = abcdef
		print(str, match[1].rm_so, match[1].rm_eo); // 最初の ( ) = abc
		print(str, match[2].rm_so, match[2].rm_eo); // 次の ( ) = def
	} else {
		puts("not match");
	}
	regfree(&regst);  // コンパイル結果の開放は必須
	return 0;
}  

一致部分は取得せずに、マッチ確認をするだけであれば、以下のように簡略化できる。

メニューに戻る

Java

マッチ判定のみ
// regex は str 全体にマッチするように記述した String。
// 以下の各行は等価
boolean match = str.matches(regex);
boolean match = java.util.regex.Pattern.matches(regex, str);
boolean match = java.util.regex.Pattern.compile(regex).matcher(str).matches()
部分一致文字列を取得
import java.util.regex.Pattern;
import java.util.regex.Matcher;
...
// regex は str 全体にマッチするように記述した String。
String regex = "(.*)=(.*)";
Pattern p = Pattern.compile(regex);
Matcher m = p.matcher(str);
if (m.matches()) {
  System.out.println(m.group(0)); // str 全体
  System.out.println(m.group(1)); // 一つめの部分一致
  System.out.println(m.group(2)); // 二つめの部分一致
}

複数行モードの注意

デフォルトは複数行モードであり、"." は改行とマッチしないなど扱いにくい場合がある。以下のいずれかにする。

メニューに戻る

Python

正規表現文字列は raw string(r"...")にすると、バックスラッシュを2つ書かなければいけないなどの面倒なことが無くなる。

デフォルトでは、正規表現は先頭に '^' があるかのように、先頭から一致させる必要がある。(末尾は一致させなくて良い)

import re

match = re.compile(r'.*(abc)(def)').match("xxxabcdefxxx")  # マッチする
if match:
	print match.group(0)  # マッチ全体 = xxxabcdefxxx
	print match.group(1)  # abc
	print match.group(2)  # def
else:
	print "not match"

メニューに戻る

Ruby

デフォルトでは、正規表現は部分一致で記述する。

if /(abc)(def)/ =~ "xxxabcdefxxx" then  # マッチする
	puts $&    # マッチ全体 = abcdef
	puts $1    # abc
	puts $2    # def

	# MatchObject $~ で、その他の詳細情報も取得できる。
else
	puts "not match"
end

メニューに戻る

Shell

egrep は、デフォルトでは、正規表現は部分一致で記述する。

echo 'xxxabcdefxxx' | egrep 'abcdef'  # マッチする

メニューに戻る