正则表达式匹配具有多行和相同列数的SQL值字符串

时间:2015-06-02 06:26:39

标签: sql regex

我尝试将sql值字符串(0),(5),(12),...(0,11),(122,33),(4,51),...(0,121,12),(31,4,5),(26,227,38),...等与正则表达式匹配

\(\s*\d+\s*(\s*,\s*\d+\s*)*\)(\s*,\s*\(\s*\d+\s*(\s*,\s*\d+\s*)*\))*

它有效。但...

如何确保正则表达式与(0,12),(1,2,3),(56,7)之类的值字符串不匹配?

提前致谢...

2 个答案:

答案 0 :(得分:1)

:(

除非你添加更多约束,否则我认为你只能用正则表达式来解决这个问题。

它无法解决所有字符串问题,因为它无法用于检查括号的打开和关闭(如“((())()(()(()))) “) 是无效的。这是一个更复杂的问题。

这就是我在课堂上学到的东西:P如果有人知道某种方式,那就更好了!

对不起,我花了一些时间研究如何将这个字符串变成一个数组并用SQL做更多的工作,但缺乏内置的功能,解决方案最终会变得非常黑客。 / p>

我建议尝试以不同方式处理这种情况,因为如果您的数据库要逐渐填满,大规模字符串计算不是最好的方法。

客户端和服务器端验证的组合可用于帮助防止不良数据(如具有更多数字的数据)进入数据库。

如果您需要保留这些数字,那么您可以重新设计您的架构,以包含一些您可以在查询中使用的元数据,例如有多少个数字以及它们是否匹配得很好。这些信息可以从您的服务器中廉价计算并提供给数据库。

祝你好运!

答案 1 :(得分:1)

正如我在评论中提到的那样,检查输入字符串是否有效的最佳方法是:括号内包含相同的数字计数,是使用客户端程序,但不清楚SQL。

实现:

List<string> s = new List<string>(){
    "(0),(5),(12)", "(0,11),(122,33),(4,51)",
    "(0,121,12),(31,4,5),(26,227,38)","(0,12),(1,2,3),(56,7)"};

var qry = s.Select(a=>new
    {
         orig = a,
         newst = a.Split(new string[]{"),(", "(", ")"},
                StringSplitOptions.RemoveEmptyEntries)
    })
        .Select(a=>new
    {
         orig = a.orig,
         isValid = (a.newst
             .Sum(b=>b.Split(new char[]{','},
                 StringSplitOptions.RemoveEmptyEntries).Count()) %
                 a.newst.Count()) ==0
    });

结果:

orig                            isValid
(0),(5),(12)                    True 
(0,11),(122,33),(4,51)          True 
(0,121,12),(31,4,5),(26,227,38) True 
(0,12),(1,2,3),(56,7)           False 

注意:第二个Select语句获取逗号实例总和的模数以及Split函数返回的字符串数组中的项数。如果结果不等于零,则表示输入字符串无效。

我坚信这是实现这一目标的最简单方法,但是 - 此时此刻 - 我不知道如何实现;)