トップページに戻る    次の正規表現パズルへ    前の正規表現パズルへ

5-25 全称肯定命題と存在否定命題

正規表現パズル

正規表現での全称肯定命題と存在否定命題に関する考察です。

正規表現で、全ての文字が数字であるか調べる方法と
正規表現で、全ての文字が数字でない調べる方法について考察します。


対象データ

12345
abc123456
abcdef


正規表現

全ての文字が数字であるか調べるには、
[^0-9]にマッチする文字があるか調べます。
^[0-9]+$で行頭から行末までたどってもいいですが・・・

全ての文字が数字でないか調べるには、
[0-9]にマッチする文字があるか調べます。
^[^0-9]+$で行頭から行末までたどってもいいですが・・・


解説

空の文字列を考えないとして、下記の同値変形を行ってます。
少なくとも1つ、の形に変形するのがポイントです。

■■■全て数字かを調べる■■■
全称肯定命題 全ての文字が数字である ⇔
存在否定命題 少なくとも1文字の、数字でない文字がない ⇔
否定文字クラスで数字でない文字を検索してもマッチしない

■■■全ての文字が数字以外かを調べる■■■
全称肯定命題 全ての文字が数字でない ⇔
存在否定命題 少なくとも1文字の、数字がない ⇔
文字クラスで数字を検索してもマッチしない


Oracle10gでの実行結果 col Val for a10 select Val, case when RegExp_Like(Val,'[^0-9]') then '少なくとも1文字は数字以外' else '全て数字' end as chk1, case when RegExp_Like(Val,'[0-9]') then '少なくとも1文字は数字' else '全ての文字が数字以外' end as chk2 from (select '12345' as Val from dual union all select 'abc123456' from dual union all select 'abcdef' from dual); Val chk1 chk2 ---------- ------------------------- --------------------- 12345 全て数字 少なくとも1文字は数字 abc123456 少なくとも1文字は数字以外 少なくとも1文字は数字 abcdef 少なくとも1文字は数字以外 全ての文字が数字以外