トップページに戻る
次の豆知識へ
前の豆知識へ
正規表現エンジンの調査(従来型NFA,POSIX NFA,DFA)
詳説正規表現2版の140ページ
詳説正規表現3版の142ページ
を参考にした、正規表現エンジンの調査です。
調査1
最小マッチをサポートするか?
調査2
"nfa not"という文字列に、"nfa|nfa not"という正規表現で検索
調査3
"=XX======================="という文字列に、"X(.+)+X"という正規表現で検索
調査結果
EmEditor 6.00.4
調査1の結果 サポートする
調査2の結果 nfaがマッチ
調査3の結果 Memory exhaustedエラー
■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■
秀丸 7.05 (HMJRE.DLL V1.92)
調査1の結果 サポートする
調査2の結果 nfa notがマッチ
調査3の結果 反応が早い
■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■
サクラエディタ 1.6.2.0 (bregonig.dll Ver.1.42. with Oniguruma 5.9.0)
サクラエディタ 2.2.0.1 (bregonig.dll Ver.3.06. with Oniguruma 5.15.0)
調査1の結果 サポートする
調査2の結果 nfaがマッチ
調査3の結果 フリーズ
■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■
C# 2008
調査1の結果 サポートする
調査2の結果 nfaがマッチ
調査3の結果 反応が遅い
using System.Text.RegularExpressions;
class Program
{
static void Main()
{
System.Console.WriteLine(Regex.Match("nfa not", "nfa|nfa not").Value);
System.Console.WriteLine(Regex.Match("=XX=======================", "X(.+)+X").Value);
}
}
■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■
Oracle 11.2.0.1.0
調査1の結果 サポートする
調査2の結果 nfaがマッチ
調査3の結果 反応が遅い
select
RegExp_Substr('nfa not' ,'nfa|nfa not') as str1,
RegExp_Substr('=XX=======================','X(.+)+X') as str2
from dual;
■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■
Chrome84とFirefox79のJavaScript
調査1の結果 サポートする
調査2の結果 nfaがマッチ
調査3の結果 反応が早い
// 調査2
var Str = 'nfa not';
var Pattern = new RegExp('nfa|nfa not');
var MatchedArr = Str.match(Pattern);
console.log(JSON.stringify(MatchedArr)); //nfa
// 調査3
var Str = '=XX=======================';
var Pattern = new RegExp('X(.+)+X');
console.log(Pattern.test(Str)); //すぐに結果が来る
■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■
PHP 5.4.45 と PHP 5.6.12
調査1の結果 サポートする
調査2の結果 nfaがマッチ
調査3の結果 反応が早い
<?php
preg_match('!nfa|nfa not!','nfa not',$matchArr);
echo $matchArr[0]; //nfa
preg_match('!X(.+)+X!','=XX======================='); //すぐに結果が来る
■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■
MySQL 5.5.62 と 5.6.26
調査1の結果 サポートしない
調査2の結果 検索する機能は無し
調査3の結果 反応が早い
select '=XX=======================' RLike 'X(.+)+X' as Res;
■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■
MySQL 8.0.12
調査1の結果 サポートしない
調査2の結果 nfaがマッチ
調査3の結果 反応が遅い
select '=XX=======================' RLike 'X(.+)+X' as Res;
// Query Error: Error: UNKNOWN_CODE_PLEASE_REPORT: Timeout exceeded in regular expression match.
select RegExp_SubStr('nfa not', 'nfa|nfa not') as Res; //nfaがマッチ
調査結果のまとめ
何らかの最適化が施されたNFAと思われる正規表現エンジン
・秀丸 7.05 (HMJRE.DLL V1.92)
・Chrome84とFirefox79のJavaScriptのJavaScript
・PHP 5.4.45 と PHP 5.6.12
従来型NFAと思われる正規表現エンジン
・EmEditor 6.00.4
・サクラエディタ 1.6.2.0 (bregonig.dll Ver.1.42. with Oniguruma 5.9.0)
・サクラエディタ 2.2.0.1 (bregonig.dll Ver.3.06. with Oniguruma 5.15.0)
・C# 2008
・Oracle 11.2.0.1.0
・MySQL 8.0.12
DFAか何らかの最適化が施されたNFAと思われる正規表現エンジン
・MySQL 5.5.62 と 5.6.26
関連リンク