2016-09-02 8 views
5

日付形式をカンマで一致させるための正規表現があります。例えばRegexオプション "Multiline"

YYYY/MM/DDまたはYYYY/MM

2016/09/02,2016/08,2016/9月30日

マイコード:

string data="21535300/11/11\n"; 
Regex reg = new Regex(@"^(20\d{2}/(0[1-9]|1[012])(/(0[1-9]|[12]\d|30|31))?,?)*$", 
         RegexOptions.Multiline); 

if (!reg.IsMatch(data)) 
    "Error".Dump(); 
else 
    "True".Dump(); 

私は複数行オプションを使用します。 文字列データに "\ n"がある場合。 すべての文字がこの正規表現に一致します。例えば

string data="test\n" 
string data="2100/1/1" 

I find option definition in MSDN

^および$ language要素の解釈が、入力文字列の先頭と末尾ではなく、行の先頭と末尾に一致するように変更されています。

なぜこの問題が発生したのか分かりませんでした。 誰でもそれを説明できますか?おかげさまで

+1

あなたの正規表現がグループである可能性があります0以上 – Kelvin

+0

はい、正規表現は空の*行*と一致します。 –

+0

ありがとうございます。私はあなたの説明の後すぐに理解します。 –

答えて

2

あなたの正規表現は、文字列の最後に改行を追加すると、空の行と一致することがあります。 "test\n"には2行が含まれ、2行目は一致します。あなたはそれが空行と一致しない場合、

^     # Matches the start of a line 
(    # Start of Group 1 
    20\d{2}/ 
    (0[1-9]|1[012]) 
    (/ 
    (0[1-9]|[12]\d|30|31) 
    )?,? 
)*    # End of group 1 - * quantifier makes it match 0+ times 
$     # End of line 

)+で最後)*を置き換える:

は、フリースペースモードでの正規表現のパターンを参照してください。

代替は

^20\d{2}/(0[1-9]|1[012])(/(0[1-9]|[12]\d|3[01]))?(,20\d{2}/(0[1-9]|1[012])(/(0[1-9]|[12]\d|3[01]))?)*$ 

のように、より展開されたパターンを使用することですregex demoを参照してください。あなたが見ることができるように、(ライン^アンカーの開始後)最初のブロックは、ここで義務ある

string date = @"20\d{2}/(0[1-9]|1[012])(/(0[1-9]|[12]\d|3[01]))?"; 
Regex reg = new Regex(string.Format("^{0}(,{0})*$", date), RegexOptions.Multiline); 

、ひいては:コード内では、ブロックを使用し、動的パターンを構築することをお勧めします空の行は決して一致しません。