Regex 如何确定正则表达式中的子字符串?

Regex 如何确定正则表达式中的子字符串?,regex,string,algorithm,pattern-matching,trie,Regex,String,Algorithm,Pattern Matching,Trie,我已经实现了一个用于模式搜索的trie,它工作得很好。使用这个trie,我可以找到文本中所有O(n)复杂度的关键字 问题是我想对我的模式(关键字)使用正则表达式,并想找到文本中存在的所有关键字 例如: 我写[a-z0-9\.]{6,30}\[a-z0-9\.]{2,12}.[a-z0-9]{2,6}来查找电子邮件id,它将为我获取正确的内容,但它不会找到位于第一个或第二个块下的子字符串 例如,我的文本为。 examplegmail@gmail.com 关键词是:sample mail 在本例中,

我已经实现了一个用于模式搜索的trie,它工作得很好。使用这个trie,我可以找到文本中所有O(n)复杂度的关键字

问题是我想对我的模式(关键字)使用正则表达式,并想找到文本中存在的所有关键字

例如: 我写[a-z0-9\.]{6,30}\[a-z0-9\.]{2,12}.[a-z0-9]{2,6}来查找电子邮件id,它将为我获取正确的内容,但它不会找到位于第一个或第二个块下的子字符串

例如,我的文本为。
examplegmail@gmail.com

关键词是:
sample mail

在本例中,此正则表达式将告诉我电子邮件id的结束位置,但它不会告诉任何有关
ample
mail
关键字的信息

编辑:假设正则表达式为a*(b|cd?)+ DFA看起来是这样的:

现在我有了类似于dfdfdacbcbcb的数据,在这些数据中,它会告诉我到达ac后每个字符的模式,等等,但是我如何知道结束模式的长度呢

您的“trie”包含操作:“测试字符”“分支到第n子树”

添加另一个操作符来保存位置:“记住第n个字符索引”,它将trie正在检查的当前字符位置写入指针数组的第n个插槽到字符串中

在(抽象)trie规范中插入这些操作符,编译为真实的trie,然后运行它。当trie matcher“跨越”匹配中的各种关键点时,它可以将这些点记录在字符串缓冲区中。在最后一场比赛中,你有一个指向比赛子部分的指针数组(任意多个)

例如:

[a-z0-9\.]{6, 30}\@[a-z0-9\.]{2,12}\.[a-z0-9]{2,6} 
想象一下,我想在@的左边和右边选择文本

我添加了位置保存操作符,我将其任意表示为“#n”:

这将(相当简单地)捕获起始位置,即“@”的位置 标记,以及(相当简单的)结束位置,如位置1、2和3。当然,你可以更多的在中间,正如你认为合适的。< /P> [许多正则表达式系统在遇到分组运算符(…)时隐式执行此操作],从左到右对分组进行编号。这通常就足够了,因为您可以在这样的分组运算符中始终包装一个有趣的子正则表达式。我喜欢显式指示方案;读者和模式匹配器都很清楚,它必须在其中插入这些位置捕获操作。我们使用精确的使用上面的#n符号。]


如果您正在寻找各种各样的关键字和相关文本,那么您的trie中可能有很多选择运算符。您可以在每个选择分支的适当位置添加这些职位捕获操作符,以挑选与关键字相关的信息。您可能需要添加另一个运算符“Recognited keyword k”,以帮助解释模式匹配器结果的代码了解找到了哪些特殊关键字,以及如何解释位置索引。

您使用的是什么语言?基本上我使用的是C,但我不要求使用正则表达式库。我正在创建一个trie,基于regex,将它们视为关键字…感谢您的回复,但我没有得到我所想的。请查看编辑并尝试澄清我的疑问。我会很感激的。你不应该改变你问题的本质(“我有一个尝试…”),然后抱怨有人花时间和精力去回答。但是答案仍然是一样的;你需要指出在比赛中你想在哪里获取位置信息。如果您构建了一个高效的匹配自动机,如您现在所示,您需要在需要了解它的状态中使用“保存我的位置”操作来修饰它的状态。如果您的模式是“a*#1(b | cd?+#2”,则需要修改state1和state4以记住指向字符源的指针……构建DFA以执行此操作需要调整其构造的标准算法。留给读者作为练习。
#1[a-z0-9\.]{6, 30}#2\@[a-z0-9\.]{2,12}\.[a-z0-9]{2,6}#3