我无法弄清"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
个字符?
注意:请参考此处的示例,不要在此讨论使用正则表达式的适用性。
答案 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
修饰符,因此您可以测试多个句子,但您不会需要它。