多线模式匹配

时间:2011-09-09 07:10:02

标签: java text-processing

问题:

在大文件(纯文本)中,有一些“有趣”的行包含一些特定的单词。目的是提取包含这些单词的所有行。但是,在某些情况下,即使一行包含这样的单词,它也可能不是真正“有趣”,这取决于它的上下文(该行上方和下方的行的内容)。应排除这些界限。

我的算法:

我有一个正则表达式,每个有趣的单词,并在文件的每一行应用此正则表达式。如果找到匹配项,我会通过应用另一组正则表达式(可能跨越行)检查是否排除了该行(取决于其上下文)。如果再次找到匹配项,则该行不是有趣的行并继续前进到其余行。如果没有,我将此行注册为有趣的行,然后转到下一行。

为了检查是否排除了一行,我创建了一个新的字符串,如下所示:

N number of lines above current line\n
The current line\n
N number of lines below current line

这需要花费大量时间。

我的问题:有更好的方法吗?

感谢您的时间。

3 个答案:

答案 0 :(得分:0)

正则表达式不一定快。那里有更快的字符串搜索算法。

如何采用更具启发性的方法。

从头到尾处理文件。将每行+偏移存储在查找结构中的感兴趣的单词行中。 填充查找结构后,开始使用以下算法处理它:

for elem in selected_word_items:
    check line + index of related search items in structure.
    if within_desired_range:
        flag_for_further_processing()

这里的关键是你正在处理文件一次,然后使用元数据结构来进行实际的上下文检查。如果使用正确的数据结构,它应该会快得多。

答案 1 :(得分:0)

很大程度上取决于您的数据形式。

您的背景有多复杂?找回有趣的比赛你会回头吗?如果是这样尝试和 避免回溯。也许你可以先确定导致以下几行有趣匹配的背景。

另外,你需要Java吗?使用unix / linux cli工具,您可以对文本文件进行非常强大和快速的操作。

请发布您的算法以及您的数据。不需要真实数据只是真实的数据。

答案 2 :(得分:0)

在正则表达式中使用多行开关(?m),并在查询中包含前后行 - 这使得正则表达式可以在多行上运行(即行尾{{ 1}}只是另一个角色)。像这样:

$

并使用它将所有输入匹配为单个字符串。