C# 什么是有效的SQL Server类表达式的正则表达式检查?

C# 什么是有效的SQL Server类表达式的正则表达式检查?,c#,sql-server,regex,C#,Sql Server,Regex,任何人都能想到检查有效的类似SQL Server的表达式有什么错误吗?我想最后一组可能是多余的,因为它被第三组所覆盖。无论如何,欢迎提出建议或改进 ^(\S*%\S*|\S*_\S*|\S*\[\S+\]\S*|\S*\[^\S+\]\S*)$ 我将此作为我的指南: 以下是我编写的测试: [TestMethod] public void SqlLikeIsValidSqlLikeTest() { Assert.IsTrue("123%456".IsVa

任何人都能想到检查有效的类似SQL Server的表达式有什么错误吗?我想最后一组可能是多余的,因为它被第三组所覆盖。无论如何,欢迎提出建议或改进

^(\S*%\S*|\S*_\S*|\S*\[\S+\]\S*|\S*\[^\S+\]\S*)$
我将此作为我的指南:

以下是我编写的测试:

    [TestMethod]
    public void SqlLikeIsValidSqlLikeTest()
    {
        Assert.IsTrue("123%456".IsValidSqlLike());
        Assert.IsTrue("%123456".IsValidSqlLike());
        Assert.IsTrue("123456%".IsValidSqlLike());
        Assert.IsTrue("123_456".IsValidSqlLike());
        Assert.IsTrue("_123456".IsValidSqlLike());
        Assert.IsTrue("123456_".IsValidSqlLike());
        Assert.IsTrue("1_23%456".IsValidSqlLike());
        Assert.IsTrue("123%45_6".IsValidSqlLike());
        Assert.IsTrue("123%456".IsValidSqlLike());
        Assert.IsTrue("12[34]56".IsValidSqlLike());
        Assert.IsTrue("123[1-2]456".IsValidSqlLike());
        Assert.IsTrue("123[1234]456".IsValidSqlLike());
        Assert.IsTrue("123[^1234]456".IsValidSqlLike());
        Assert.IsTrue("[1234]456".IsValidSqlLike());
        Assert.IsTrue("123[1234]".IsValidSqlLike());
        Assert.IsTrue("123[^1-4]456".IsValidSqlLike());
        Assert.IsTrue("[^1-4]456".IsValidSqlLike());
        Assert.IsTrue("123[^1-4]".IsValidSqlLike());
        Assert.IsTrue("12[3-]56".IsValidSqlLike());
        Assert.IsTrue("12[^]56".IsValidSqlLike());
    }

    [TestMethod]
    public void SqlLikeIsNotValidSqlLikeTest()
    {
        Assert.IsFalse("123456".IsValidSqlLike());
        Assert.IsFalse("12[3456".IsValidSqlLike());
        Assert.IsFalse("1234]56".IsValidSqlLike());
        Assert.IsFalse("12]34[56".IsValidSqlLike());
        Assert.IsFalse("]34[56".IsValidSqlLike());
        Assert.IsFalse("34[^56".IsValidSqlLike());
        Assert.IsFalse("12]34[".IsValidSqlLike());
        Assert.IsFalse("12[]56".IsValidSqlLike());
    }

这可能不是您想要的确切解决方案,而是解决问题的方法

如果您有一个SQL连接,您可以在执行SQL命令之前使用“SET NOEXEC ON”命令来避免编写SQL解析器。这告诉SQL不要执行任何命令,只需评估它们是否会被执行

SqlCommand cmd = new SqlCommand("SET NOEXEC ON", conn);
cmd.ExecuteNonQuery();
cmd = new SqlCommand(sqlToBeChecked, conn);
cmd.ExecuteNonQuery();
如果没有抛出异常,则一切正常

或者这里有其他的方法


希望它能帮助您

SQL Server不支持正则表达式。它使用的表达式确实与正则表达式有一些相似之处,但在功能上与正则表达式相去甚远。恐怕我看不懂正则表达式,但是,如果你解释一下你在这里想要实现什么,我很乐意尝试提供一个SQL
,比如满足你需要的表达式。而不是向我们展示那种可怕的正则表达式,您能给我们显示它应该匹配的数据吗?检查SQL
LIKE
子句是否有效是什么意思?因此,您在哪里进行正则表达式检查?请详细说明您的情况。什么使like表达式无效?
like
对任何有效的T-SQL字符串表达式都有效。对于任何馈送到
类似的
子句的字符串,您永远不会得到错误,如果您“弄错了”(但您不知道匹配的
a-z]
是否正是用户想要的,而不是
[a-z]
的打字错误),它将不符合您的期望。您的有效性检查要么是不必要的,要么应该受到业务考虑的限制,而不是基于纯粹的语法。我确实看到了SQL解析器的答案,但它似乎太过符合我的要求。此外,我正在使用服务,需要调用该服务以在该服务上运行SQL,然后获取结果,而我确信我可以使用正则表达式执行我想要的操作。只是我不是regex方面的专家,虽然我相信这是可行的(我已经编写了一些运行正常的测试),但我希望得到一些确认。