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

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

正規表現のエンジンによって異なりますが、
実際のところ、後方参照を使えればNFAなので
ほとんどの正規表現は、選択で左に記述したのを優先すると思われます。

下記の正規表現で調査
AB|ABBB|ABC


対象データ

ABC
ABBB


調査結果

EmEditor 6.00.4  左に記述したのを優先
秀丸 7.05        最長一致
サクラエディタ 1.6.2.0 左に記述したのを優先
Oracle 10.2.0.1.0  左に記述したのを優先
Oracle 11.2.0.1.0  左に記述したのを優先
VB.NET 2003  左に記述したのを優先
C# 2008      左に記述したのを優先
ruby 1.9.0   左に記述したのを優先


---Oracleの調査で使用---------------------------------------------------------
select
RegExp_Substr('ABC' ,'AB|ABBB|ABC') as str1,
RegExp_Substr('ABBB','AB|ABBB|ABC') as str2
  from dual;

---VB.NETの調査で使用---------------------------------------------------------
Imports System.Text.RegularExpressions

Dim num1 As String = Regex.Match("ABC", "AB|ABBB|ABC").Value
MsgBox(num1)

Dim num2 As String = Regex.Match("ABBB", "AB|ABBB|ABC").Value
MsgBox(num2)

---C#の調査で使用---------------------------------------------------------
using System.Text.RegularExpressions;

class Program
{
    static void Main()
    {
        System.Console.WriteLine(Regex.Match("ABC", "AB|ABBB|ABC").Value);
        System.Console.WriteLine(Regex.Match("ABBB", "AB|ABBB|ABC").Value);
    }
}

---rubyの調査で使用---------------------------------------------------------
ConstRegex = /^AB|ABBB|ABC/
hairetu = Array.new
hairetu.push("ABC")
hairetu.push("ABBB")

puts "Pattern #{ConstRegex.source}"
for i in (0..hairetu.length-1)
    willOut = "Line#{i+1} #{hairetu[i]} "
    work = hairetu[i].scan(ConstRegex).first
    if work then
        willOut += "matchs " + work
    else
        willOut += "no match"
    end
    puts willOut
end


関連リンク

正規表現エンジンの調査(従来型NFA,POSIX NFA,DFA)