我将如何跨多行搜索一串单词

时间:2015-06-06 17:40:29

标签: java parsing input io bufferedreader

这是我正在处理的作业,要求我从文件中读取数据并通过它解析查找某些关键短语或名称的行号和起始索引。该文件是在线托管的,因此我决定使用URL类来提取数据,而不是在本地下载文件,如果这样做有所不同。

我可以拉入数据,读取数据,查找行号,列号并对其进行排序。我要挂断的是数据跨越两条线。目前我正在使用BufferedReader逐行阅读并单独解析每一行,但这排除了使用换行符/回车分解短语的任何实例。我想也许我应该把所有的数据都读成一个字符串,这样我就可以解析它,寻找新行可能会破坏我的话语的实例。

不确定这是否是解决此问题的正确方法。我怎么能这样做?

编辑:数据集是嵌入在元素中的文本内容。没有\ n或\ rr似乎存在于任何一行的末尾。

编辑:不寻找代码。只需要几个额外的大脑来帮助我以不同的方式思考这个问题。

编辑:也许不是最好的解决方法......我们在DS / Algo课程的夏季会议初期,因此效率尚未经过测试。我抓住了当前行的最后一个字,并在下一行向peak运行了一个hasNext()操作。我们只使用两个单词名称,否则将保证更重的RegEx解决方案。

感谢大家的反馈。

3 个答案:

答案 0 :(得分:1)

我认为你要么:

  1. 标准化您的关键短语和名称(代表"word\nplus\nword"为" n + 1 plus n + 2 word ")
  2. 将换行作为匹配字符的一部分处理(逐字节处理而不是逐行处理)
  3. 根据您当前的策略,选项1会更容易,因为您可以保留需要匹配的事物的列表,并将每个事物提供给该行以查看如果它仍然匹配或应该重新开始。像

    这样的东西
    in <- get url <input url>
    results <- empty list
    phrases <- process phrases <input phrases>
    while in has line
      line <- next line from in
      for each phrase in phrases
        send line to phrase
        state <- state of phrase
        if state is found then
          add phrase result to results
    

    显然,这意味着每个短语的表示将是有状态的,并且是过程的活跃部分,即负责处理每一行并处理多行匹配所需的任何内部状态。

答案 1 :(得分:0)

我猜你可以试试Regex。 This是指向它的链接。

它基本上是一个搜索引擎,允许您使用“表达式/算法”来指定搜索内容。

满足您需求的示例可能是:

"phrase[\n ]*?is[\n ]*?a[\n ]*?test"

匹配两种情况:

This is a test. The phrase
is a test. This is a test
the phrase is a test.

[\n ]*?部分表示如果短语包含新行

,它将匹配

三种可能性(在单词之间)有三次

----------------------------------编辑.----------- -------------------

您可以随时使用regexpal尝试使用正则表达式。

答案 2 :(得分:0)

如果搜索可以跨越多行,那么你没有行 - 你有一个字符串(带有嵌入的换行字符)。以此为基础解决问题,一个简单的解决方案(不给你代码)将首先使用正则表达式来查找短语,在用\s+替换短语中的所有空格并将其用作正则表达式之后。如果你受到了打击,请查看点击前的所有测试:换行数是你的行号,最后一行换行后的字符数是你的列。