English 中文(简体)
基于输入的 Regex 创建
原标题:Regex creation based upon input

我有一个以PHP写成的网络应用程序,它包含Javascript和JQuery, 将用作我公司库存管理系统(IMS)的功能。 我希望能够创建基于用户输入值的 Regex 表达式。

其背后的想法是,大多数制造商的序列号图案、字符长度和从字母到数字值的混合体,都是某一部分独有的。因此,当某个部分被添加到IMS,而第一个序列号被扫描到系统中时,我希望将Regex 语句建成并保存到与该部分类型相对应的数据库表格中。如果今后如果一个序列号被扫描,则该部分就应该作为部分类型自动选择,因为它与该制造商的序列号图案相对应。我知道,这一方法可能并不总是对一个部分真实无误,所以我甚至可以退回一份符合该系统图案的部件清单,而不是需要用户在目录中查找的部件清单。

我问的是,在代码中设定一个函数能够破译用户给出的创建 Regex 表达式的值的最佳起点是什么? 我不是要求一个完整的函数,而是如何审视我的状况和目标的起点,这样我才能理解从何开始。我划伤了足够长的头发,并多次开始写字功能,只为了删除整个街区,知道我正面临灾难。

代码中的任何内容都可能 - 这可行吗?


<强度 > EDIT - 倾斜SAMPLE VALUES < /强 >

DVD-RW(驱动车)

  • 1613518L121
  • 1613509L121
  • 1613519L121

VGA 输出卡

  • 0324311071068
  • 0324311071134

COM 扩张卡

  • 608131234
  • 608131237

硬驱动器

  • WMAYUJ753738
  • WMAYUJ072099
  • WMAYUJ683739
  • WMAYUJ844900

正如您可以看到某些值将只对一定长度的字符进行数字计算。 其它的则在开头有字母字符, 然后有一系列数字。 其它的则可能有字母/ 数字字符相互交叉。 在多数情况下, 一个简单的字母/ 数字规则长度将适合确定我们货物列表中的单部分类型。 但是, 在多个表达式符合一个值的情况下, 我只需要让应用程序显示一个符合正则的两种或多种产品的列表, 并提示用户选择正确的部分。 总的来说, 这将节省在 WMS 数据库中选择产品类型的时间和错误 。

感谢各位的评论。我理解我没有问一个问题,这个问题只有一个答案。我正在寻找一个起点,说明如何最好地跨过绳子,并发表一个相应的雷克思语句,该语句将与其价值相匹配。

最佳回答

@Pete说,我认为你为自己设定了过于雄心勃勃的目标。有些想法,也许与你的具体需求过于笼统。

我认为您想要扫描类似 1-56592-487-8 的序列号, 并推断正则表达式 /d- d{5}- d{3}- d/ 匹配部分来自特定制造商 。 (这恰好是我的“ 在 Nutshell 中的 Java ” 副本的 ISBN- 10 。 ISBN不是序列号, 而是和我一起工作 。) 但是您可以从几个例子中推断出制造商所使用的模式。 也许第一个字符位置是 exx 位数( 0- F) 。 也许最后一个字符是一个可以是一个数字或 X 的校验和( 如 ISBNs ) 。 也许有一个不总是存在的后缀, 表示工厂。 所以您会发现自己会为同一个制造商/ 部分类型建立许多模式, 作为部件出现的新实例 。

您也会遇到反向问题。 部件的制造者使用regex/ [A- Z]{ { 3} d{ 7} /, 音响螺旋驱动器的制造者使用相同的模式 。

说到这里,关于你所能做的最好的事情...............

for each character in the scanned serial number
    if it is a capital letter
        add [A-Z] to the regular expression
    else if it is a digit
        add d to the regular expression
    else 
        add the character itself to the regular expression, escaped as necessary
 end for
 collapse multiple occurrences with the {,} interval qualifier

http://en.wikipedia.org/wiki/Vehicle_Identification_Number” rel = “no follow” >Vehicle识别号码 的规则或许也令人振奋。 想想你如何推断VIN的规则, 举几个例子。

问题回答

EDIT:抱歉,我的试样代码太烦人了 您需要这种算法 作为您猜测的部分的第一步 : < a href="http://en.wikibooks.org/wiki/Algorithm_ instruction/Strings/Longest_common_substring" rel="无跟踪 norefererr" > longs substring or < a href="https://stackoverflow.com/ questions/2892931/loongest-common-substring- from- more-than- two-strings-python" < a>

您需要添加迭代和一些掩码, 如上面和David解释的, 以及下面的样本中, DVD- RW 的“ L121” 并不被猜测( 正如我说过我必须从共同开始 ) 。 因此您需要找到所有共同的连续后继序列, 并决定哪个相干序列是相关的! (可能是某种最大化增益函数 )

使用第二链接长_ substr :

>>> for x in d:
    for y in d:
        if x == y: continue
        common = long_substr([x, y])
        length = len(common)
        if x.startswith(common) and y.startswith(common):
            print "	".join((x, y, str(length), common))

生产gt;

0324311071068   0324311071134   10  0324311071
0324311071134   0324311071068   10  0324311071
1613519L121 1613518L121 6   161351
1613519L121 1613509L121 5   16135
WMAYUJ844900    WMAYUJ753738    6   WMAYUJ
WMAYUJ844900    WMAYUJ072099    6   WMAYUJ
WMAYUJ844900    WMAYUJ683739    6   WMAYUJ
WMAYUJ753738    WMAYUJ844900    6   WMAYUJ
WMAYUJ753738    WMAYUJ072099    6   WMAYUJ
WMAYUJ753738    WMAYUJ683739    6   WMAYUJ
1613518L121 1613519L121 6   161351
1613518L121 1613509L121 5   16135
WMAYUJ072099    WMAYUJ844900    6   WMAYUJ
WMAYUJ072099    WMAYUJ753738    6   WMAYUJ
WMAYUJ072099    WMAYUJ683739    6   WMAYUJ
WMAYUJ683739    WMAYUJ844900    6   WMAYUJ
WMAYUJ683739    WMAYUJ753738    6   WMAYUJ
WMAYUJ683739    WMAYUJ072099    6   WMAYUJ
608131237   608131234   8   60813123
1613509L121 1613519L121 5   16135
1613509L121 1613518L121 5   16135
608131234   608131237   8   60813123

- 从这里开始第一个错误回复

下面是我答复的第一部分, 只会帮助你了解我哪里错了, 并可能给你们一些想法:

使用最长期常见子序列问题解答器