从字符串集派生RegExp
Derive RegExp from set of strings
想象一下有一组任意的字符串。我们现在假设,除了几个后续字符之外,它们都是相等的(如果这个假设不成立,我可以返回一个错误)。我现在想要派生一个正则表达式来标识字符串中不同的部分。
输入:"你好,爱丽丝,我是鲍勃输出:"你好(.+),我是鲍勃。"输入:"星期一"、"树"、"狗"输出:错误
也许找到最长的公共子串或Levenstein距离会有所帮助?我还不确定其中一个是否真的适用于我的问题,或者如何使用它们来解决它。
您遇到了一个问题,决定使用regexp来解决它——现在您有两个问题。:-)
抛开玩笑不谈,你可以把它分解为两个步骤:
- 识别字符串之间的差异
- 看看所有的差异,找出一个正则表达式来匹配它们
对于(1),需要在您的语言中使用diff计算库(如Python中的difflib
)来查找两个字符串之间相同区域的列表。如果所有字符串都有公共段,那么将字符串-1与字符串-[2..N]中的每一个进行比较,以分析得到的相同块(在比较每个块的内容及其相对于其他相同块的位置时,你必须聪明)。提取并记录相同块之间的文本。
对于您的示例,每次比较时都会得到两个相同的块:"Hello "
和", I'm Bob."
。相同块之间的文本将是以下字符串:"Alice"
、"John"
、"Josh"
。
对于(2),最简单的解决方案是将您的发现组合成一个相当字面的正则表达式,该正则表达式由以下部分组成:
Hello
+(Alice|John|Josh)
+, I'm Bob.
或者,用.*
替换所有字符串中相同块之间的任何段。考虑将其作为非贪婪匹配——.*?
。
我不知道自动机理论,也不能帮助你进行DFA/NFA,但如果你需要更高的精度,这是一个坚实的方向。
相关文章:
- 为什么使用 "this" 指针调用派生成员函数?
- 具有奇怪重复模板模式的派生类中的成员变量已损坏
- 在派生函数中指定void*参数
- 如何通过派生类函数更改基类中的向量
- 如何委托派生类使用其父构造函数?
- 如何使用单独文件中的派生类访问友元函数对象
- 派生类销毁的最佳实践是什么
- 如何使用基类指针引用派生类成员
- 派生类是否可以在抽象工厂设计模式中具有数据成员
- 使用基类指针创建对象时,缺少派生类析构函数
- 如何引用基类的派生类?
- 存储模板类型以强制转换回派生<T>
- 需要从 istream 和 ostream 派生 iostream
- 在 C++ 中用派生类型重写成员函数
- 具有多个类、派生类的C++正向声明
- 有没有一种"cleaner"的方法可以在指向基的指针向量中找到派生类的第一个实例?
- 用常见虚拟函数实现的任意组合来实现派生类的正确方法是什么
- 如果基类包含双指针成员,则派生类的构造函数
- 为什么此派生对象无法访问基类的后递减方法?
- 从字符串集派生RegExp