我已经实现了一个用于模式搜索的trie,并且工作正常。使用这个特里,我可以找到O(n)复杂度中文本中存在的所有关键字。
问题是我想在我的模式(关键字)中使用正则表达式,并希望找到文本中的所有关键字。
实施例: 我写 [a-z0-9 \。] {6,30} \ @ [a-z0-9 \。] {2,12} \。[a-z0-9] {2,6} < / strong>查找电子邮件ID,它会向我提取正确的内容,但它不会找到位于第一个或第二个块下的子字符串。
例如,我将文字作为。
examplegmail@gmail.com
和关键字为:ample mail
在此示例中,此正则表达式将告诉我电子邮件ID的结束位置,但它不会告诉我有关ample
或mail
关键字的任何内容。
编辑:假设我有正则表达式 a *(b | cd?)+ 而DFA看起来像::
现在我在这个数据中有像 dfdfdacbcbbcb 这样的数据它会告诉我在达到 ac 之后的模式等等但是我怎么去知道结束模式的长度????
答案 0 :(得分:1)
你的“trie”包含操作:“test for char”“branch to nth subtree”。
添加另一个运算符来保存位置:“记住第N个字符索引”,它将trie正在检查的当前字符位置写入指向字符串的指针数组的第n个插槽。
在(抽象)trie规范中插入这些运算符,编译为真实的trie,然后运行它。当特里匹配器“越过”匹配中的各个关键点时,它可以在字符串缓冲区中记录这些点。在最后一场比赛中,你有一系列指针(你喜欢多少)到你的比赛的子部分。
对于你的例子:
[a-z0-9\.]{6, 30}\@[a-z0-9\.]{2,12}\.[a-z0-9]{2,6}
想象一下,我想在@。
的左侧和右侧选择文本我添加了位置保存操作符,我将其任意表示为“#n”:
#1[a-z0-9\.]{6, 30}#2\@[a-z0-9\.]{2,12}\.[a-z0-9]{2,6}#3
这将(相当简单地)捕捉起始位置,“@”的位置 标志,并且(相当简单地)结束位置,作为位置1,2和3.当然,你可以在中间更多地,你认为合适。
[许多正则表达式系统在遇到分组运算符(...)时隐式执行此操作,从左到右对分组进行编号。这总是足够的,因为你总是可以在这样的分组运算符中包装一个有趣的子正则表达式。我喜欢明确的指示方案;读者和模式匹配器很清楚,它必须插入这些位置捕获操作。我们使用上面的#n表示法实现了正则表达式匹配器。]。
如果您正在寻找各种各样的关键字和相关文字,您的特里可能会有很多选择运算符。您可以在每个选择分支的适当位置添加这些位置捕获运算符,以选择与关键字相关的信息。您可能需要添加另一个运算符“识别的关键字k”,以帮助解释模式匹配器结果的代码了解找到哪些特殊关键字,以及如何解释位置索引。