.net 学习正则表达式模式的算法
好的。。。所以这可能是一个延伸。 我想向函数提供一个文本字符串列表,然后 然后它会将正则表达式语法返回给我。 我正在使用一种标签模式,或者是要跟踪的项目的标签。 我希望能够检测到所有可能存在的模式。 我认为一个可以总结它的正则表达式会很棒 这是以前做过的事情吗 我在VB.NET C中工作,建议可以 也许这是一个糟糕的编程设计。但我现在最想的是从哪里开始搜索? 我甚至可以在谷歌下查找什么.net 学习正则表达式模式的算法,.net,regex,vb.net,algorithm,.net,Regex,Vb.net,Algorithm,好的。。。所以这可能是一个延伸。 我想向函数提供一个文本字符串列表,然后 然后它会将正则表达式语法返回给我。 我正在使用一种标签模式,或者是要跟踪的项目的标签。 我希望能够检测到所有可能存在的模式。 我认为一个可以总结它的正则表达式会很棒 这是以前做过的事情吗 我在VB.NET C中工作,建议可以 也许这是一个糟糕的编程设计。但我现在最想的是从哪里开始搜索? 我甚至可以在谷歌下查找什么 或者你能给我一些关于如何设计这样一个函数的指导吗?非常有趣的问题。不确定是否有一个好的答案,但这是我想到的第一
或者你能给我一些关于如何设计这样一个函数的指导吗?非常有趣的问题。不确定是否有一个好的答案,但这是我想到的第一件事:
Loop through each target string
Loop through each character in each target string
Categorize that character as precisely as possible. 7 = \d, f=[a-z] etc
Create a list of the categories for each character in order.
Add that list of categories to a list of lists
End character loop
End target string loop
尝试使用类别列表列表来确定将匹配所有目标字符串的正则表达式。例如,如果您的类别列表如下所示:
\d,\d,\d,[a-z],[a-z]
\d,\d,\d,[a-z],[a-z]
\d,\d,[a-z],[a-z]
您可以确定您的正则表达式需要匹配两到三个数字,后跟两个小写字母。没有太多可供选择的,但也许是一个开始的地方?我很想知道你是否提出了一个有效的解决方案……虽然
*
是一个有趣的评论,但如果你添加一个约束,即它是一个最小的正则表达式(对于每个操作符的某个成本指标),接受所有数据,但不接受其他数据,那么问题就变得更有趣了
这导致了下一个问题:您的数据可能没有反映所有示例,因此您真正需要的是将数据按类(字符、数字、符号)划分。即使这样也会很困难:如果你真的关心一个例子中的角色大小写,而不是另一个例子中的角色大小写呢。如果有些符号是分隔符,有些是分隔符,还有一些是数据的一部分,该怎么办
换句话说,如果有足够的限制,您可以通过可能的正则表达式(在您有限的语法中)进行广度优先搜索,当您找到一个有效的正则表达式时,您可以停止搜索。如果这在您的特定用例中是现实的,那么将高度依赖于这些限制。。。在一般正则表达式不受限制的情况下,这是不现实的。我对这件事的看法: 问题陈述
abc
abcd
cde
cef
^(a(b(c(d|())))|c(d(e)|e(f)))$
给定有限字符串S1..Sn的有限集,找到一个正则表达式,该正则表达式与这些字符串整体匹配,而不匹配其他字符串,从而避免了平凡的解决方案^S1 | S2 | S3 |..Sn$
观察结果
我们不能有“.”字符类或“+”、“*”或“{x,}”量词,因为它们允许在输入集之外匹配字符串
算法
# strings and collections indexed from 1
regex := "^" + make_regex(S) + "$"
function make_regex(Ss)
# string -> length
Ls := { length Ss[i] | 1 <= i <= n }
# set of starting characters
Cs := unique { Ss[i][1] | i in 1..n L[i] >= 1 }
cl := last in Cs
ret := "("
For c in Cs
# substrings of all non-empty strings that start with c
Scs := { S[i][2..] | i in 1..n, L[i] >= 1, S[i][j] = c }
ret := ret + c + make_regex(Scs)
If c != cl
ret := ret + "|"
End
End
If Ss contains ""
ret := ret + "|()"
End
ret := ret + ")"
return ret
End
结果
abc
abcd
cde
cef
^(a(b(c(d|())))|c(d(e)|e(f)))$
我相信这是O(n*Lmax),因为查找唯一字符串的正则表达式与其长度成线性关系。但是,输入集中的前缀越常见,它就越接近O(Lmax),因此将与结果匹配-比^S1 | S2 |·····································Sn。这是一个函数的一部分,它返回与您传递的字符串匹配的正则表达式模式。这似乎更适合机器学习者或PGM。但这更难。事实上。。。您是在寻找一个与一组字符串完全匹配的正则表达式,还是一个与一组字符串和所有“类似”的字符串匹配的正则表达式?然而,将所有可能性填充到一个哈希表中并使用该哈希表进行检查更为有效我将OP的问题理解为获取一个与输入字符串和“类似”字符串匹配的正则表达式,对于一些尚未定义的相似性概念。正如@staafl所指出的,您正在解决的问题有点愚蠢,因为结果不是特别可解释的,而且它的效率低于哈希表或trie查找。耶,谢谢。。。阿贝。这给了我一个好的开始。我可以看到这是如何应用在这么多不同的方式取决于预期的最终结果。