给定一个RE,获得最大的子字符串匹配
问题描述:
我正在寻找一个位的代码将:给定一个RE,获得最大的子字符串匹配
Given regular expression E, derive the longest string X
such that for every S, X is a substring of S iff S will match E
例子:
E = "a", X = "a"
E = "^a$", X = "a"
E = "a(b|c)", X = "a"
E = "[ab]", X = ""
背景:我要匹配一些正则表达式仅支持子字符串搜索的数据存储 。通过对数据存储应用子串 来优化正则表达式搜索将会很好,以尽可能地减少传输的数据量 。
例子2:
如果我想赶上 “错误富”, “错误酒吧”, “错误巴兹”,我可能会指定
error: (foo|bar|baz)
和发送
search "error: "
到数据存储,然后重新编译返回的项目。
谢谢!
答
通常而言,您可以尝试在所有非唯一((a | b),[ab])匹配处拆分正则表达式,然后查找结果数组中的最长字符串。像
$foo = longest(regex_split($regex, '(\(.*?\|.*?\))|(\[.*?\])'));
答
东西也许RE转换为有限状态自动机,并寻找需要存在于开始之间的路径,并完成国家......有图几何思维可以更容易给你最长的部分,至少它是在我的情况。
如果E =“a(b | c)def”,那么X =“def”?没有额外的信息,搜索“def”不会立即有帮助。 噢,所有这些“S =”都应该是“X =”? – 2009-07-01 06:02:42