簡體   English   中英

為什么正則表達式模式與文本不匹配?

[英]Why regex pattern doesn't match with text?

我有一個正則表達式模式,我想將其與我的cron表達式匹配:

string pattern = @"(((([0-9]|[0-5][0-9])(-([0-9]|[0-5][0-9]))?,)*([0-9]|[0-5][0-9])(-([0-9]|[0-5][0-9]))?)|(([\\*]|[0-9]|[0-5][0-9])/([0-9]|[0-5][0-9]))|([\\?])|([\\*]))[\\s](((([0-9]|[0-5][0-9])(-([0-9]|[0-5][0-9]))?,)*([0-9]|[0-5][0-9])(-([0-9]|[0-5][0-9]))?)|(([\\*]|[0-9]|[0-5][0-9])/([0-9]|[0-5][0-9]))|([\\?])|([\\*]))[\\s](((([0-9]|[0-1][0-9]|[2][0-3])(-([0-9]|[0-1][0-9]|[2][0-3]))?,)*([0-9]|[0-1][0-9]|[2][0-3])(-([0-9]|[0-1][0-9]|[2][0-3]))?)|(([\\*]|[0-9]|[0-1][0-9]|[2][0-3])/([0-9]|[0-1][0-9]|[2][0-3]))|([\\?])|([\\*]))[\\s](((([1-9]|[0][1-9]|[1-2][0-9]|[3][0-1])(-([1-9]|[0][1-9]|[1-2][0-9]|[3][0-1]))?,)*([1-9]|[0][1-9]|[1-2][0-9]|[3][0-1])(-([1-9]|[0][1-9]|[1-2][0-9]|[3][0-1]))?(C)?)|(([1-9]|[0][1-9]|[1-2][0-9]|[3][0-1])/([1-9]|[0][1-9]|[1-2][0-9]|[3][0-1])(C)?)|(L(-[0-9])?)|(L(-[1-2][0-9])?)|(L(-[3][0-1])?)|(LW)|([1-9]W)|([1-3][0-9]W)|([\\?])|([\\*]))[\\s](((([1-9]|0[1-9]|1[0-2])(-([1-9]|0[1-9]|1[0-2]))?,)*([1-9]|0[1-9]|1[0-2])(-([1-9]|0[1-9]|1[0-2]))?)|(([1-9]|0[1-9]|1[0-2])/([1-9]|0[1-9]|1[0-2]))|(((JAN|FEB|MAR|APR|MAY|JUN|JUL|AUG|SEP|OCT|NOV|DEC)(-(JAN|FEB|MAR|APR|MAY|JUN|JUL|AUG|SEP|OCT|NOV|DEC))?,)*(JAN|FEB|MAR|APR|MAY|JUN|JUL|AUG|SEP|OCT|NOV|DEC)(-(JAN|FEB|MAR|APR|MAY|JUN|JUL|AUG|SEP|OCT|NOV|DEC))?)|((JAN|FEB|MAR|APR|MAY|JUN|JUL|AUG|SEP|OCT|NOV|DEC)/(JAN|FEB|MAR|APR|MAY|JUN|JUL|AUG|SEP|OCT|NOV|DEC))|([\\?])|([\\*]))[\\s]((([1-7](-([1-7]))?,)*([1-7])(-([1-7]))?)|([1-7]/([1-7]))|(((MON|TUE|WED|THU|FRI|SAT|SUN)(-(MON|TUE|WED|THU|FRI|SAT|SUN))?,)*(MON|TUE|WED|THU|FRI|SAT|SUN)(-(MON|TUE|WED|THU|FRI|SAT|SUN))?(C)?)|((MON|TUE|WED|THU|FRI|SAT|SUN)/(MON|TUE|WED|THU|FRI|SAT|SUN)(C)?)|(([1-7]|(MON|TUE|WED|THU|FRI|SAT|SUN))?(L|LW)?)|(([1-7]|MON|TUE|WED|THU|FRI|SAT|SUN)#([1-7])?)|([\\?])|([\\*]))([\\s]?(([\\*])?|(19[7-9][0-9])|(20[0-9][0-9]))?| (((19[7-9][0-9])|(20[0-9][0-9]))/((19[7-9][0-9])|(20[0-9][0-9])))?| ((((19[7-9][0-9])|(20[0-9][0-9]))(-((19[7-9][0-9])|(20[0-9][0-9])))?,)*((19[7-9][0-9])|(20[0-9][0-9]))(-((19[7-9][0-9])|(20[0-9][0-9])))?)?)";
  string text = "0 0 0 ? APR,MAY * 2020,2021,2022"
  Match match = Regex.Match(text, pattern);

//the match output is: "0 0 0 ? APR,MAY *";

atter瀝瀝不是我無法弄清楚為什么的年代。

編輯:很抱歉以前的帖子中的javascript標簽現在我想解釋一下為什么這樣做。它是.net項目中的ac#,我想在前端檢查一下,所以我很體貼,這就是為什么我放上javascript標簽。 對不起,這可能不好。
關於主題:我有一個cron表達式,例如在“字符串文本”變量中的上方。 我想檢查給定的cron表達式是否有效。 我們可以認為cron表達式有7個字段
“第二分鍾小時DayOfMount月DayOfWeek Year”所有字段之間都有一個空格。字符串模式覆蓋除年以外的所有時間。

該表達式是為POSIX正則表達式引擎編寫/生成的。 POSIX引擎嘗試匹配最長的子匹配項。

C#是.NET語言,並使用基於PCRE的引擎。 它嘗試匹配最左邊的子匹配。

例如,模式[0-9]|[0-5][0-9]在POSIX引擎中將嘗試將“ 59”匹配為“ 5”。 PCRE引擎嘗試匹配最左邊的引擎,因此它將僅嘗試[0-9]替代項,並在成功時停止。

在您的模式中,對於基於PCRE的引擎,替代項的順序不是最佳的,有時是錯誤的。 這是一個重寫的模式:

( #1
    (
        ([0-5][0-9]|[0-9])
        (-([0-5][0-9]|[0-9]))?
        ,
    )*
    ([0-5][0-9]|[0-9])
    (-([0-5][0-9]|[0-9]))?
  | ([*]|[0-5][0-9]|[0-9])
    \/
    ([0-5][0-9]|[0-9])
  | [?]
  | [*]
)
[\s]
( #2
    (
        ([0-5][0-9]|[0-9])
        (-([0-5][0-9]|[0-9]))?
        ,
    )*
    ([0-5][0-9]|[0-9])
    (-([0-5][0-9]|[0-9]))?
  | ([*]|[0-5][0-9]|[0-9])
    \/
    ([0-5][0-9]|[0-9])
  | [?]
  | [*]
)
[\s]
( #3
    (
        ([0-1][0-9]|[2][0-3]|[0-9])
        (-([0-1][0-9]|[2][0-3]|[0-9]))?
        ,
    )*
    ([0-1][0-9]|[2][0-3]|[0-9])
    (-([0-1][0-9]|[2][0-3]|[0-9]))?
  | ([*]|[0-1][0-9]|[2][0-3]|[0-9])
    \/
    ([0-1][0-9]|[2][0-3]|[0-9])
  | [?]
  | [*]
)
[\s]
( #4
    (
        ([0][1-9]|[1-2][0-9]|[3][0-1]|[1-9])
        (-([0][1-9]|[1-2][0-9]|[3][0-1]|[1-9]))?
        ,
    )*
    ([0][1-9]|[1-2][0-9]|[3][0-1]|[1-9])
    (-([0][1-9]|[1-2][0-9]|[3][0-1]|[1-9]))?
    C?
  | ([0][1-9]|[1-2][0-9]|[3][0-1]|[1-9])
    \/
    ([0][1-9]|[1-2][0-9]|[3][0-1]|[1-9])
    C?
  | LW
  | L(-([1-2][0-9]|[3][0-1]|[0-9]))?
  | [1-3][0-9]W
  | [1-9]W
  | [?]
  | [*]
)
[\s]
( #5
    (
        (0[1-9]|1[0-2]|[1-9])
        (-(0[1-9]|1[0-2]|[1-9]))?
        ,
    )*
    (0[1-9]|1[0-2]|[1-9])
    (-(0[1-9]|1[0-2]|[1-9]))?
  | (0[1-9]|1[0-2]|[1-9])
    \/
    (0[1-9]|1[0-2]|[1-9])
  | (
        (JAN|FEB|MAR|APR|MAY|JUN|JUL|AUG|SEP|OCT|NOV|DEC)
        (-(JAN|FEB|MAR|APR|MAY|JUN|JUL|AUG|SEP|OCT|NOV|DEC))?
        ,
    )*
    (JAN|FEB|MAR|APR|MAY|JUN|JUL|AUG|SEP|OCT|NOV|DEC)
    (-(JAN|FEB|MAR|APR|MAY|JUN|JUL|AUG|SEP|OCT|NOV|DEC))?
  | (JAN|FEB|MAR|APR|MAY|JUN|JUL|AUG|SEP|OCT|NOV|DEC)
    \/
    (JAN|FEB|MAR|APR|MAY|JUN|JUL|AUG|SEP|OCT|NOV|DEC)
  | [?]
  | [*]
)
[\s]
( #6
    (
        [1-7]
        (-[1-7])?
        ,
    )*
    [1-7]
    (-[1-7])?
  | [1-7]\/[1-7]
  | (
        (MON|TUE|WED|THU|FRI|SAT|SUN)
        (-(MON|TUE|WED|THU|FRI|SAT|SUN))?
        ,
    )*
    (MON|TUE|WED|THU|FRI|SAT|SUN)
    (-(MON|TUE|WED|THU|FRI|SAT|SUN))?
    C?
  | (MON|TUE|WED|THU|FRI|SAT|SUN)
    \/
    (MON|TUE|WED|THU|FRI|SAT|SUN)
    C?
  | ([1-7]|MON|TUE|WED|THU|FRI|SAT|SUN)
    [#]
    [1-7]
  | ([1-7]|MON|TUE|WED|THU|FRI|SAT|SUN)
    (LW|L)?
  | [?]
  | [*]
)
( #7
    [\s]
    (
        (19[7-9][0-9]|20[0-9][0-9])
        (-(19[7-9][0-9]|20[0-9][0-9]))?
        ,
    )*
    (19[7-9][0-9]|20[0-9][0-9])
    (-(19[7-9][0-9]|20[0-9][0-9]))?
  | [\s]
    (19[7-9][0-9]|20[0-9][0-9])
    \/
    (19[7-9][0-9]|20[0-9][0-9])
  | [\s]
    [*]
)?

或壓縮成字符串:

var pattern = @"((([0-5][0-9]|[0-9])(-([0-5][0-9]|[0-9]))?,)*([0-5][0-9]|[0-9])(-([0-5][0-9]|[0-9]))?|([*]|[0-5][0-9]|[0-9])\/([0-5][0-9]|[0-9])|[?]|[*])[\s]((([0-5][0-9]|[0-9])(-([0-5][0-9]|[0-9]))?,)*([0-5][0-9]|[0-9])(-([0-5][0-9]|[0-9]))?|([*]|[0-5][0-9]|[0-9])\/([0-5][0-9]|[0-9])|[?]|[*])[\s]((([0-1][0-9]|[2][0-3]|[0-9])(-([0-1][0-9]|[2][0-3]|[0-9]))?,)*([0-1][0-9]|[2][0-3]|[0-9])(-([0-1][0-9]|[2][0-3]|[0-9]))?|([*]|[0-1][0-9]|[2][0-3]|[0-9])\/([0-1][0-9]|[2][0-3]|[0-9])|[?]|[*])[\s]((([0][1-9]|[1-2][0-9]|[3][0-1]|[1-9])(-([0][1-9]|[1-2][0-9]|[3][0-1]|[1-9]))?,)*([0][1-9]|[1-2][0-9]|[3][0-1]|[1-9])(-([0][1-9]|[1-2][0-9]|[3][0-1]|[1-9]))?C?|([0][1-9]|[1-2][0-9]|[3][0-1]|[1-9])\/([0][1-9]|[1-2][0-9]|[3][0-1]|[1-9])C?|LW|L(-([1-2][0-9]|[3][0-1]|[0-9]))?|[1-3][0-9]W|[1-9]W|[?]|[*])[\s](((0[1-9]|1[0-2]|[1-9])(-(0[1-9]|1[0-2]|[1-9]))?,)*(0[1-9]|1[0-2]|[1-9])(-(0[1-9]|1[0-2]|[1-9]))?|(0[1-9]|1[0-2]|[1-9])\/(0[1-9]|1[0-2]|[1-9])|((JAN|FEB|MAR|APR|MAY|JUN|JUL|AUG|SEP|OCT|NOV|DEC)(-(JAN|FEB|MAR|APR|MAY|JUN|JUL|AUG|SEP|OCT|NOV|DEC))?,)*(JAN|FEB|MAR|APR|MAY|JUN|JUL|AUG|SEP|OCT|NOV|DEC)(-(JAN|FEB|MAR|APR|MAY|JUN|JUL|AUG|SEP|OCT|NOV|DEC))?|(JAN|FEB|MAR|APR|MAY|JUN|JUL|AUG|SEP|OCT|NOV|DEC)\/(JAN|FEB|MAR|APR|MAY|JUN|JUL|AUG|SEP|OCT|NOV|DEC)|[?]|[*])[\s](([1-7](-[1-7])?,)*[1-7](-[1-7])?|[1-7]\/[1-7]|((MON|TUE|WED|THU|FRI|SAT|SUN)(-(MON|TUE|WED|THU|FRI|SAT|SUN))?,)*(MON|TUE|WED|THU|FRI|SAT|SUN)(-(MON|TUE|WED|THU|FRI|SAT|SUN))?C?|(MON|TUE|WED|THU|FRI|SAT|SUN)\/(MON|TUE|WED|THU|FRI|SAT|SUN)C?|([1-7]|MON|TUE|WED|THU|FRI|SAT|SUN)[#][1-7]|([1-7]|MON|TUE|WED|THU|FRI|SAT|SUN)(LW|L)?|[?]|[*])([\s]((19[7-9][0-9]|20[0-9][0-9])(-(19[7-9][0-9]|20[0-9][0-9]))?,)*(19[7-9][0-9]|20[0-9][0-9])(-(19[7-9][0-9]|20[0-9][0-9]))?|[\s](19[7-9][0-9]|20[0-9][0-9])\/(19[7-9][0-9]|20[0-9][0-9])|[\s][*])?";

您可能還希望在模式的開頭添加^ ,在模式的末尾添加$ 這樣可以確保在匹配的CRON表達式之前或之后沒有多余的字符。

var pattern = @"^((([0-5] ... [\s][*])?$";

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM