【问题标题】:Regex filter out space at the end of line正则表达式过滤掉行尾的空格
【发布时间】:2013-08-31 05:25:18
【问题描述】:

为什么下面的代码在 C# 中什么也找不到,但我在线测试时却可以正常工作?

Match m = Regex.Match(@"abc
cd", "^abc[ \t]*$", RegexOptions.Multiline);

我正在使用这个在线正则表达式测试器:http://derekslager.com/blog/posts/2007/09/a-better-dotnet-regular-expression-tester.ashx

我希望得到“abc”

【问题讨论】:

  • 不同风格的正则表达式。你是在哪里在线测试的?
  • 这只是一个例子。我想得到没有空格的“abc”,假设我将组添加到我的正则表达式中。
  • 在模式之前需要@吗?
  • 我想我需要一个@之前的模式
  • 你确定你的正则表达式在这个网站上工作吗?对我来说不是,如果你添加它们,它会返回空格,因为你在你的正则表达式中搜索它们......如果你想在 linestart 之后获得第一个“abc”,为什么不只使用“^abc”?跨度>

标签: c# regex


【解决方案1】:

我想我知道这里发生了什么。在我的文本文件中,EOL 是 CRLF。但是 C# 正则表达式将 LF 视为 EOL(即“$”)。所以在我的情况下,正则表达式找不到 CR 并声称失败。 @"^abc[ \t\r]*$" 有效。

【讨论】:

    【解决方案2】:

    据我了解,您没有捕获任何组,因此您一无所获。

    先试试这个:

    Debug.Print(Regex.IsMatch(@"abc
    cd", "^abc[ \t]*$", RegexOptions.Multiline).ToString());
    

    你应该得到true,因为有匹配项。

    然后试试这个:(注意'^'之后和'$'之前的大括号'()')

    Debug.Print(Regex.Match(@"abc
    cd", "^(abc[ \t]*)$", RegexOptions.Multiline).ToString());
    

    您应该会在Output Window 中获得结果。

    希望对你有帮助!

    【讨论】:

      【解决方案3】:

      如果你想得到abc 您可以改用:^abc.*$

      如果你想得到所有, 您可以改用:(?s)^abc.*$

      我认为您的问题是: [ \t] 无法匹配换行符,因此您也可以更改代码以匹配换行符,如下所示:

      Match m = Regex.Match(@"abc
              cd", @"^abc[ \t\r]*$", RegexOptions.Multiline);
      

      【讨论】:

      • 我原来的表达是这样的@"^[ \t]*[[Language =(?'abbr'.+)[(?'name'.+)]]][ \t] *$”。我确实想确保除了我想要的东西之外剩下的是空间。
      • [\t]后面有个'*',所以如果没有空格应该没问题。而且我不想匹配换行符。
      • @leon 但在您的 C# 代码中,字符串:@"abc cd" 确实有换行符,因此您的正则表达式将不起作用。
      • 但是'$'符号是否意味着行尾?
      【解决方案4】:

      对于多行字符串,您可以不使用 Regex 删除末尾的空格。

      string trimEnd = string.Join("\n", yourString.Split('\n').Select(x => x.TrimEnd()));
      

      【讨论】:

      • 感谢您的回答。我只是想弄清楚正则表达式有什么问题。
      猜你喜欢
      • 2010-12-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-10-04
      • 1970-01-01
      • 2012-11-03
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多