【问题标题】:Why doesn't this Regular Expression match a space?为什么这个正则表达式不匹配空格?
【发布时间】:2009-09-09 22:16:25
【问题描述】:

我有以下正则表达式:

([0-9]+),'(.)':([0-9]+),(L|R|'.')

正好符合这个:

1,'a':1,R

但是,如果我将 a 替换为空格,则会失败:

1,' ':1,R

为什么 . 不匹配?空格不归类为字符吗?我不能使用 \s 因为我不想匹配制表符和换行符。我也试过了:

([0-9]+),'(.| )':([0-9]+),(L|R|'.')

但这也不起作用(而且我没有启用IgnorePatternWhitespace)。

【问题讨论】:

    标签: .net regex whitespace spaces


    【解决方案1】:

    我无法重现您所看到的:

    using System;
    using System.Text.RegularExpressions;
    
    class Test
    {
        static void Main()
        {
            Regex regex = new Regex("([0-9]+),'(.)':([0-9]+),(L|R|'.')");
            Console.WriteLine(regex.IsMatch("1,' ':1,R"));
        }
    }
    

    打印“真”。

    引号之间是否还有其他字符?一些非印刷字符?文本来自哪里?

    您可以尝试将其更改为:

    ([0-9]+),'([^']+)':([0-9]+),(L|R|'.')
    

    所以它可以在引号之间匹配多个字符。

    【讨论】:

    • 您的代码也适用于我。当我复制并粘贴字符串以直接从我自己的代码中匹配时,它甚至匹配,我想这排除了非打印字符理论。但是,我的程序仍然失败。唯一的区别是我在调用 regex.Match 之后检查 match.Success,而不是调用 regex.IsMatch。这可能与它有关吗?至于你的第二个建议,应该只允许一个字符。
    • 没关系,我发现了问题。我在其他一些代码中弄乱了 if 语句,最终在与正则表达式匹配之前从每一行中删除了所有空格。我将其更改为仅去除单引号之外的空格,现在它可以工作了。不过,检查非打印字符对于其他情况是一个很好的建议,因此我将其标记为答案。
    【解决方案2】:

    我没有在 .NET 中尝试过,但点是特定于语言和实现的。试试:

    ([0-9]+),'([.| ])':([0-9]+),(L|R|'.')
    

    【讨论】:

      【解决方案3】:

      使用 \0x0020 将匹配单个空格字符。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-08-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-09-17
        • 2014-05-14
        • 1970-01-01
        相关资源
        最近更新 更多