繁体   English   中英

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

[英]Regex match SQL values string with multiple rows and same number of columns

我试图匹配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)(0,12),(1,2,3),(56,7)

提前致谢...

:(

除非您添加更多约束,否则我认为您不能仅使用正则表达式来解决此问题。

它不能解决您所有的字符串问题,就像它不能用于检查方括号(例如“((())()((()(()())))”)无效。 那是一个更复杂的问题。

那就是我在课堂上学到的:P如果有人知道一种方法,那就太好了!

抱歉,我花了一些时间研究如何将字符串转换为数组并使用SQL对其进行更多工作,但缺少内置功能,解决方案最终会变得很棘手。

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

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

如果您需要保留这些数字,则可以对架构进行重新整理,以包括一些可在查询中使用的元数据,例如有多少个数字以及它们是否完全匹配。 可以从您的服务器廉价地计算该信息并将其提供给数据库。

祝好运!

正如我在对该问题的评论中提到的那样,检查输入字符串是否有效的最佳方法是:在方括号之间包含相同数量的数字,是使用客户端编程,但不能清除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函数返回的字符串数组中的项数的模。 如果结果不等于零,则表示输入字符串无效。

我坚信,有一种最简单的方法可以实现这一目标,但是-目前,我不知道如何;)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM