我正在尝试有效地提取静态字符串(必须匹配给定正则表达式匹配的字符串).我已经能够在最简单的情况下完成它,但我正在尝试发现一个更强大的解决方案.
鉴于如下所示的正则表达式
"fox jump(ed|ing|s)"
Run Code Online (Sandbox Code Playgroud)
会给我们的
"fox,jumped,jumping,jumps"
Run Code Online (Sandbox Code Playgroud)
另一个例子是
"fox jump(ed|ing|s)?"
Run Code Online (Sandbox Code Playgroud)
哪会给我们
"fox,jump"
Run Code Online (Sandbox Code Playgroud)
因为可选的运算符
我现在的算法过于简单了.它将从正则表达式的末尾开始并删除组或单个字符,然后是这些运算符"*?" 以及"爆炸"分组OR运算符"(|)".这种方法效果很好,但没有考虑正则表达式的完整语法.您可以将其视为正则表达式的最小集生成过程(正则表达式可以"生成/必须匹配"的最小字符串集).
为什么? 我试图将一堆文本与大量正则表达式进行匹配.如果我可以获得"必需"这些正则表达式的"关键字"列表,我可以对该关键字进行快速文本搜索,以过滤我关心的正则表达式(忽略我保证不匹配的正则表达式,甚至跳过该文本完全有效地没有在文本上运行任何正则表达式,因为我们保证在我们的正则表达集中没有匹配).我可以在一个有效的数据结构(Binary Search/Trie/Aho-Corasick)中组织这组关键字,以便在我尝试通过有限自动机运行文本之前过滤一组正则表达式.在尝试运行正则表达式之前,我可以将极快的字符串匹配算法作为过滤阶段运行.在这个简单的过程中,我已经能够提高吞吐量.
下面的脚本将一堆csv文件加载到mysql数据库中.我试图在循环中执行此函数,但名为return的mysql表字段导致脚本认为它应该执行函数返回.
`around返回是为mysql转义它,它是一个mysql关键字.
for f in *.txt;
do
mysql -uroot -ppassword -e "LOAD DATA INFILE '$f' INTO TABLE info FIELDS TERMINATED BY ',' LINES TERMINATED BY '\n' (`return`,`id`,`field1`,`field2`);";
done
Run Code Online (Sandbox Code Playgroud)