2012-02-24 7 views
5

これは「間違っている」という明白なケースです。正規表現を使用して数字を比較する

整数が任意の値より小さいかどうかを判断するために正規表現を生成できますか?これは実際にはこれを行うつもりはありません。

これは簡単です。 1000未満の整数の場合、\ d {1,3}はそのトリックを行うべきです。整数< 500の場合は、[0-4] {0,1} \ d {1,2}を使用することができるので、少し面倒ですが、それほど悪くはありません。

任意の値になると、トリッキーが大きくなります。たとえば、255未満の数字は\ d {1,2}のようなものです。 [0-1] \ d {2} | [2] [0-4] \ d | [2] [5] [0-4]。

ここには1つの正規表現がありますか?または、正規表現をプログラムで生成する必要がありますか?

(そして再び、あなたの好きなプログラミング言語で「FOO <バー」を使用すると、はるかに効率的で読みやすいです明らかに。私は実際にこれを行うつもりはありませんことを指摘しましょう。)

+0

あなたはそれはあなたが何を意味するかである場合、単一の1を取得する必要があります3つの式を組み合わせることができます。 – Dervall

答えて

3

ます」各境界数の式を生成する必要があります。仕事をする正規表現があるとしましょう。その正規表現は、入力として一連の文字列を取ることができなければなりません。しかし、正規表現と有限状態オートマトンは同等であることを知っているので、FSAの定義と矛盾する無限の状態数を必要とする可能性があるため、FSMを構築できるということと同じです。

+0

?それができないと言っているのですか、これは本当におかしいと言いますか? OPが明らかに非負の数値空間を暗示しているにもかかわらず、あなたは負の数を暗示していますか? – tripleee

+0

できません。正規表現を書くことはできません。正規表現は、一般に、任意の数が有限でないため任意の数が任意の数よりも大きいかどうかを示します。 –

+0

OPは特定の番号を意味する場合、彼は自明に行うことができます。その後、彼が野心的であると感じたら、対応するFSMを最小化し、最小限の正規表現を使用します。 –

2

これは非常に簡単です。

#!/usr/bin/env perl 
use strict; 
use warnings; 
use Regexp::Assemble; 

for my $n (@ARGV) { 
    my $asm = new Regexp::Assemble; 
    for (1 .. $n) { $asm->add($_) } 
    for ($asm->re){ 
     s/\)$/\$/; 
     s/^[^:]*:/^/; 
     print "$n => /$_/\n"; 
    } 
} 

今1とその数との間の整数と一致するパターンを見つけるためにそれを実行します。

$ perl /tmp/ra 5 15 153 401 1144 
5 => /^[12345]$/ 
15 => /^(?:[23456789]|1[]?)$/ 
153 => /^(?:1(?:[6789]|5[0123]?|0\d?|1\d?|2\d?|3\d?|4\d?)?|2\d?|3\d?|4\d?|5\d?|6\d?|7\d?|8\d?|9\d?)$/ 
401 => /^(?:1(?:0\d?|1\d?|2\d?|3\d?|4\d?|5\d?|6\d?|7\d?|8\d?|9\d?)?|2(?:0\d?|1\d?|2\d?|3\d?|4\d?|5\d?|6\d?|7\d?|8\d?|9\d?)?|3(?:0\d?|1\d?|2\d?|3\d?|4\d?|5\d?|6\d?|7\d?|8\d?|9\d?)?|4(?:[123456789]|0[01]?)?|5\d?|6\d?|7\d?|8\d?|9\d?)$/ 
1144 => /^(?:1(?:0(?:0\d?|1\d?|2\d?|3\d?|4\d?|5\d?|6\d?|7\d?|8\d?|9\d?)?|1(?:[56789]|4[]?|0\d?|1\d?|2\d?|3\d?)?|2\d?|3\d?|4\d?|5\d?|6\d?|7\d?|8\d?|9\d?)?|2(?:0\d?|1\d?|2\d?|3\d?|4\d?|5\d?|6\d?|7\d?|8\d?|9\d?)?|3(?:0\d?|1\d?|2\d?|3\d?|4\d?|5\d?|6\d?|7\d?|8\d?|9\d?)?|4(?:0\d?|1\d?|2\d?|3\d?|4\d?|5\d?|6\d?|7\d?|8\d?|9\d?)?|5(?:0\d?|1\d?|2\d?|3\d?|4\d?|5\d?|6\d?|7\d?|8\d?|9\d?)?|6(?:0\d?|1\d?|2\d?|3\d?|4\d?|5\d?|6\d?|7\d?|8\d?|9\d?)?|7(?:0\d?|1\d?|2\d?|3\d?|4\d?|5\d?|6\d?|7\d?|8\d?|9\d?)?|8(?:0\d?|1\d?|2\d?|3\d?|4\d?|5\d?|6\d?|7\d?|8\d?|9\d?)?|9(?:0\d?|1\d?|2\d?|3\d?|4\d?|5\d?|6\d?|7\d?|8\d?|9\d?)?)$/ 
関連する問題