C#Regex.Replace()吞下原始字符串的一部分

时间:2016-03-16 18:04:28

标签: c# regex

我无法弄清"FROM ROOT"发生时Regex.Replace()会发生什么:

static string query = @"
SELECT * 
FROM root
ORDER BY root['UtcTimestamp'] DESC";

static void Main(string[] args)
{
    var endsWithOrderBy = new Regex("^.+(\\s+ORDER\\s+BY\\s+.+)$",
        RegexOptions.Multiline | RegexOptions.IgnoreCase | RegexOptions.Compiled);

    query = query.Trim();

    var result = endsWithOrderBy.Replace(query, "$1");

    Console.Write(result);
    Console.Read();
}

我认为这是因为\n而不是"FROM root\nORDER BY"之间的空格。如何告诉正则表达式在\n中包含\\s个字符?

注意:请参考此处的示例,不要在此讨论使用正则表达式的适用性。

2 个答案:

答案 0 :(得分:2)

查看the documentation,因为您已指定RegexOptions.Multiline^锚点与行的开头匹配,而不是字符串的开头。

因此,您的模式匹配:

FROM root
ORDER BY root['UtcTimestamp'] DESC

然后用第一次捕获的值替换它,即:

{\n}
ORDER BY root['UtcTimestamp'] DESC

给出了结果:

SELECT *

ORDER BY root['UtcTimestamp'] DESC

目前尚不清楚您期望的输出。如果您只想删除整个ORDER BY子句,则添加一个组以捕获前缀:

var endsWithOrderBy = new Regex("^(.+)(\\s+ORDER\\s+BY\\s+.+)$", ...);

答案 1 :(得分:1)

您可以使用:

\s*\n?\s*(ORDER\s+BY\s+.*)$

如果您在行的开头(^)使用锚点,则ORDER BY前面没有换行符,即SELECT * FROM root ORDER BY root['UtcTimestamp'] DESC,则无法匹配。

点击此处:https://regex101.com/r/gQ2rQ1/2

我使用g修饰符,因此您可以测试多个句子,但您不会需要它。