トップページに戻る    次の豆知識へ    前の豆知識へ

正規表現エンジンの調査(従来型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


関連リンク

選択は左に記述したのを優先するかの調査