从输入字符串动态创建正则表达式模式
Posted
技术标签:
【中文标题】从输入字符串动态创建正则表达式模式【英文标题】:Dynamically create a regex pattern from input string 【发布时间】:2017-04-20 00:59:34 【问题描述】:我的数据库中存储了多个称为订单号模式的字符串。此模式由主用户/公司在为自己设置应用程序时指定。
因此,任何从其公司创建订单的用户都必须遵循此模式。模式集可以是'000000'
或'AAA00000'
或'AA00aaa000'
等(数字、大写字母、小写字母和特殊字符的混合)
我需要做的是验证当用户输入订单号时,它与公司设置的模式匹配,即如果用户输入BX12-xyz-345
,然后检查它是否匹配模式'AA00-aaa-000'
。
我认为理想的做法是根据当前模式生成一个正则表达式模式并将其存储在客户记录中,这样我就可以更轻松地使用Regex.match
函数进行匹配。唯一的问题是我必须为我们大约 250 多个客户中的每一个手动创建正则表达式模式,因此想知道是否有办法可以传入字符串并返回该字符串的正则表达式模式。
理想情况下,如果我可以在 SQL server (vial bulk update)
中执行此操作,如果不是,我不介意在 C#
中创建一个一次性 exe,它可以使用其正则表达式模式更新每条记录,并更改应用程序,以便将来仅将正则表达式模式存储在数据库中。
【问题讨论】:
我担心答案是你可能会写一个坐在那里进行模式匹配并确定这个有 3 个字母,后跟 6 个数字,而那个是 2 个字母 8 个数字 2 个字母。但是.. 输入 250 个代码会更快。 问题是,当我们有一个新客户并且他们输入了一个 AA-0000-aaa 的模式时,我记得去更新该记录的正则表达式,如果我忘记了系统然后将无法正常运行 同意。有一些工具可以帮助找出可能的模式,但很难确定你找到了正确的模式。在您的示例中,如果用户输入 BX12-xyz-345,您怎么知道 oppattern 不是 AX##-aaa-###?或者如果这些字段中的任何一个可能是字母数字?在需求收集/入职阶段要求客户提供模式会更好。如果您在记住做某事时遇到问题,请查看流程工具。如果你忘记做这样的事情,你可能也错过了其他事情。 为什么是动态的?如果只有您在此处概述的内容,您可以使用一个正则表达式。^\d6$|^[A-Z]3-?\d5$|^[A-Z]2-?\d2-?[a-z]3-?\d3$
这个特定的正则表达式将检查代码的格式是否为000000
、AAA-00000
、AAA00000
、AA00aaa000
甚至AA-00-aaa-000
或AA00-aaa-000
等。
由于 REGEX 在 SQL Server 中非常有限,这将是我尝试处理它的最后一个地方。例如,不要在 SQL 中进行检查。只是我的两分钱。
【参考方案1】:
假设 A/a/0 代表 A-Z、a-z 和 0-9 并且您不使用任何保留的模式字符,您可以构建模式掩码:
declare @pattern varchar(max) = 'AA00-aaa-000'
set @pattern = replace(replace(replace(@pattern COLLATE Latin1_General_BIN, 'A', '[A-Z]'), 'a', '[a-z]'), '0', '[0-9]')
select @pattern
[A-Z][A-Z][0-9][0-9]-[a-z][a-z][a-z]-[0-9][0-9][0-9]
if 'BX12-xyz-345' like @pattern print 'y'
【讨论】:
在我眼皮底下偷了它:-) 非常感谢 Alex K。有时这种简单的事情并没有引起人们的注意。现在问这么简单的问题感到很愚蠢。以上是关于从输入字符串动态创建正则表达式模式的主要内容,如果未能解决你的问题,请参考以下文章