我尝试将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 :(得分: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
函数返回的字符串数组中的项数。如果结果不等于零,则表示输入字符串无效。
我坚信这是实现这一目标的最简单方法,但是 - 此时此刻 - 我不知道如何实现;)