【问题标题】:Regex that matches a newline (\n) in C#与 C# 中的换行符 (\n) 匹配的正则表达式
【发布时间】:2010-11-13 14:06:18
【问题描述】:

好吧,这个让我发疯了...... 我有一个这样形成的字符串:

var newContent = string.Format("({0})\n{1}", stripped_content, reply)

newContent 将显示如下:
(旧文)
新文本

我需要一个正则表达式来去除括号之间的文本,其中包含括号和换行符。

我能想到的最好的是:

const string  regex = @"^(\(.*\)\s)?(?<capture>.*)";
var match= Regex.Match(original_content, regex);
var stripped_content = match.Groups["capture"].Value;

这可行,但我想专门匹配换行符 (\n),而不是任何空格 (\s) 将 \s 替换为 \n \\n\\\n 不起作用。

请帮助我保持理智!

编辑:一个例子:

public string Reply(string old,string neww)
        {
            const string  regex = @"^(\(.*\)\s)?(?<capture>.*)";
            var match= Regex.Match(old, regex);
            var stripped_content = match.Groups["capture"].Value;
            var result= string.Format("({0})\n{1}", stripped_content, neww);
            return result;
        }

Reply("(messageOne)\nmessageTwo","messageThree") returns :
(messageTwo)
messageThree

【问题讨论】:

  • 你能发布一个简短但完整的程序来演示这个问题吗?我现在很难拼凑起来。

标签: c# .net regex


【解决方案1】:

如果您指定 RegexOptions.Multiline,那么您可以使用 ^$ 分别匹配行的开头和结尾。

如果您不想使用此选项,请记住新行可以是以下任何一种:\n\r\r\n,因此您不必只查找\n,而是也许应该使用类似:[\n\r]+,或更准确地说:(\n|\r|\r\n)

【讨论】:

  • 别忘了交替不是贪婪的;如果您将正则表达式应用于"\r\n",它将仅匹配"\r"。我会改用(\n|\r\n?)(\r\n?|\n)
  • 我无法让它与多行选项一起使用。 (\n|\r|\r\n) 成功了。它表明在这种特殊情况下 \r\n 是获得匹配所必需的,即使我只在要匹配的字符串中插入了 \n。
  • @AlanMoore 谢谢你。我很困惑为什么\r\n 匹配了两次。
【解决方案2】:

实际上它可以工作,但有相反的选项,即

 RegexOptions.Singleline

【讨论】:

  • 不错!为我修好了!不知何故,使用多行选项不会忽略行尾。但是单线做到了! +1
  • 感谢您的建议,多行输入在Singleline 模式下处理得很好……但行为不同,有时Singleline 行为正是您所需要的!我知道我的输入是多行的,所以我没有真正考虑它设置Multiline 选项...但在这种情况下.(点)与换行符不匹配,这就是我真正的意思通缉。设置为 Singleline 解决了这个问题。 $ 在这种情况下匹配输入字符串的结尾,这也很方便。所以吸取了教训:多行输入并不总是意味着应该使用Multiline 选项!
  • 我不知道这是否是 OP 想要的,但这就是我想要的!那就是在文本中搜索我的正则表达式,并有效地忽略换行。谢谢。
  • SingleLine 不是 MultiLine 的对立面。它们是不同的概念,名字很不幸,可以一起使用。
【解决方案3】:

你的\n 之前可能会有一个\r。尝试将 \s 替换为 (\r\n)。

【讨论】:

    【解决方案4】:

    认为我参加聚会可能有点晚了,但仍然希望这会有所帮助。

    我需要在两个井号之间获取多个标记。

    示例 i/p:

    ## 令牌1 ##
    ## 令牌2 ##
    ## token3_a
    令牌3_b
    token3_c ##

    这似乎对我有用:

    var matches = Regex.Matches (mytext, "##(.*?)##", RegexOptions.Singleline);

    当然,您可能想用自己的字符替换两端的双井号。

    HTH。

    【讨论】:

      【解决方案5】:

      虽然违反直觉,但您可以同时使用 MultilineSingleline 选项。

      Regex.Match(input, @"(.+)^(.*)", RegexOptions.Multiline | RegexOptions.Singleline)
      

      第一个捕获组将包含第一行(包括\r\n),第二个捕获组将包含第二行。

      为什么:

      首先RegexOptions枚举是flag所以可以和位运算符结合,然后

      • Multiline:

      ^$ 匹配每行的开头和结尾(而不是输入字符串的开头和结尾)。

      • Singleline:

      句点 (.) 匹配每个字符(而不是除 \n 之外的每个字符)

      see docs

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-12-14
        • 1970-01-01
        • 2014-06-30
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多