代码之家  ›  专栏  ›  技术社区  ›  theSealion

regex没有将字符串与c匹配,但联机工具计算结果为ok

  •  0
  • theSealion  · 技术社区  · 5 年前

    我有一个正则表达式

    (?'Conpany'Company) - (?'Model'Model) - (?'Version'V(?'Major'\d+).(?'Minor'\d+).(?'Bugfix'\d+).(?'Build'\d+)(?'PreRelease'-[[:alnum:]]*)?(?'Meta'\+[[:alnum:]]*)?) - (?'CompileDate'(?'Year'\d{4})(?'Month'\d{2})(?'Day'\d{2}))
    

    应该与SCPI字符串匹配

    Company - Model - V1.0.0.1718-RC1 - 20190821
    

    如果我用一个在线工具尝试regex,一切正常,字符串与regex匹配。

    现在我尝试使用带有c的正则表达式来计算命令应答,结果总是错误的

        var regex = @"(?'Conpany'Company) - (?'Model'Model) - (?'Version'V(?'Major'\d+).(?'Minor'\d+).(?'Bugfix'\d+).(?'Build'\d+)(?'PreRelease'-[[:alnum:]]*)?(?'Meta'\+[[:alnum:]]*)?)" - (?'CompileDate'(?'Year'\d{4})(?'Month'\d{2})(?'Day'\d{2}))";
    
        // 
        responce = await rs232Device.SendCommand(query, DefaultTimeout);
    
        var match  = Regex.Match(responce.Message, regex, RegexOptions.IgnoreCase); 
        //
        Assert.That(match.Success, Is.True); 
    

    我发现编译日期 - (?'CompileDate'(?'Year'\d{4})(?'Month'\d{2})(?'Day'\d{2})) 从正则表达式一切都很好。

    但我不知道为什么它不能在c中与完整的regex一起工作 https://regex101.com/ 可以匹配字符串。

    1 回复  |  直到 5 年前
        1
  •  2
  •   Wiktor Stribiżew    5 年前

    .NET正则表达式引擎不支持POSIX字符类。你有 [[:alnum:]] 这里,换成 \w (任何 word char ) [\p{L}\p{N}] (任何字母或数字)或 [^\W\p{Pc}] (除连接器标点之外的任何字符,如 _ )会成功的。

    参见其他posix字符类 例子 映射(它们可能无法完全相同但至少类似地工作):

    POSIX        .NET             Description
    [:alpha:]   \p{L}           Any letters (\p{L} matches only those from the BMP plane)
    [:alnum:]   [\p{L}\p{N}]    Any letters or digits
    [:digit:]   \p{N} or \d     Any digits (there is also a [:d:] POSIX variation)
    [:space:]   \s or \p{Z}     Any whitespace
    [:blank:]   [\p{Zs}\t]      Any horizontal whitespace
    

    除此之外,还有一些扩展到

    POSIX        .NET             Description
    [:ascii:]   [\x00-\x7E]     ASCII character set
    [:xdigit:]  [0-9a-fA-F]     Chars that are used to define hex values
    

    此外,你必须在图案中转义文字点。

    此外,始终使用与您计划用于模式的regex引擎兼容的web regex测试仪。

    (?'Conpany'Company) - (?'Model'Model) - (?'Version'V(?'Major'\d+)\.(?'Minor'\d+)\.(?'Bugfix'\d+)\.(?'Build'\d+)(?'PreRelease'-\w*)?(?'Meta'\+\w*)?) - (?'CompileDate'(?'Year'\d{4})(?'Month'\d{2})(?'Day'\d{2}))
    

    regex demo

    enter image description here