代码之家  ›  专栏  ›  技术社区  ›  Aurelien Ribon

EOL特殊字符不匹配

  •  4
  • Aurelien Ribon  · 技术社区  · 16 年前

    我使用的模式如下:

    "^[ \t]*(\\w+)[ \t]*->[ \t]*(\\w+)((?:,[ \t]*\\w+)*)$"
    

    a -> b
    b -> c
    c -> d
    

    功能是:

    private void ParseAndBuildGraph(String input) {
        MatchCollection mc = Regex.Matches(input, "^[ \t]*(\\w+)[ \t]*->[ \t]*(\\w+)((?:,[ \t]*\\w+)*)$", RegexOptions.Multiline);
        foreach (Match m in mc) {
            Debug.WriteLine(m.Value);
        }
    }
    

    输出为:

    c -> d
    

    实际上,以“$”特殊字符结尾的行有一个问题。如果在“$”之前插入“\r”,则可以使用,但我认为“$”会匹配任何行终止符(使用多行选项),尤其是在Windows环境中。不是这样吗?

    3 回复  |  直到 16 年前
        1
  •  7
  •   Alan Moore Chris Ballance    16 年前

    $ 行分隔符 ,在 --人物 \n . 这种行为与Perl的regex风格是一致的,但在我看来,它仍然是错误的。 According to the Unicode standard , $

    , \r\n , \r , \x85 \u2028 \u2029 , \v \f

    …永远不匹配 \右 . Java符合这一点(除了 \五 \f级 ),但是.NET,它在Java之后很久才出现,而且它的Unicode支持至少和Java一样好,只承认 \不 . 你认为他们至少能处理 正确地说,考虑到Microsoft与该行分隔符的关联有多强。

    请注意 . \不 比赛 \右 . 如果你用过 .+ 而不是 \w+ 在regex中,您可能没有注意到这个问题;回车应该包含在匹配中,但是当您打印结果时控制台会忽略它。

    编辑:如果要允许回车,而不将其包含在结果中,则可以用lookahead替换锚点: (?=\r?\n .

        2
  •  1
  •   Ben Voigt    16 年前

        3
  •  1
  •   Alan Moore Chris Ballance    16 年前

    你的意思是 \t \t型 ? 我总是在正则表达式中使用逐字字符串文字:

    @"^[ \t]*(\w+)[ \t]*->[ \t]*(\w+)(,[ \t]*\w+)*$"
    

    (你唯一需要逃离的是 " ""