我将如何跨多行搜索一串单词
How would I go about searching for a string of words across multiple lines
这是我正在做的一项家庭作业,要求我从文件中读取数据并通过它进行解析,以找到某些关键短语或名称的行号和起始索引。该文件是在线托管的,所以我决定使用 URL class 来提取数据,而不是在本地下载文件,如果这会有所不同的话。
我可以毫无问题地提取数据、读取数据、查找行号、列号并对其进行排序。我挂断的是数据跨越两行。目前我正在使用 BufferedReader 逐行阅读并单独解析每一行,但这不包括短语被 newline/carriage return 分解的任何情况。我在想,也许我应该将所有数据读入一个字符串,这样我就可以解析它,寻找换行符可能会打断我的话的实例。
不确定这是否是解决此问题的正确方法。我还能怎么做?
编辑:数据集是嵌入在元素中的文本内容。任何行的末尾似乎都没有 \n 或 \r。
编辑:不是在寻找代码。只是一些额外的大脑可以帮助我以不同的方式思考这个问题。
编辑:也许这不是解决此问题的最佳方法...我们在这个 DS/Algo 课程的夏季课程初期,因此尚未测试效率。我抓取了当前行的最后一个字,并在下一行 运行 对 peak
执行 hasNext() 操作。我们只使用两个单词名称,否则更重的 RegEx 解决方案将被 war运行ted。
感谢大家的反馈。
我猜你可以试试正则表达式。 This 是 link 的原样。
它基本上是一个搜索引擎,允许您使用 "expression/algorithm" 指定您要搜索的内容。
满足您需要的示例可能是:
"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 的正则表达式。
如果搜索可以跨越多行,那么您没有行 - 您只有一个字符串(带有嵌入的换行符)。考虑到这一点来解决这个问题,一个简单的解决方案(不给你代码)将涉及首先使用正则表达式查找短语,然后用 \s+
替换短语中的所有空格并将其用作正则表达式。如果命中,查看命中前的所有测试:换行数是你的行号,最后一个换行后的字符数是你的列。
我认为你:
- 标准化您的关键短语和名称(将
"word\nplus\nword"
表示为 "line n has word, line n+1 has plus, line n+2 has word")
- 将换行符作为匹配字符的一部分进行处理(逐字节处理而不是逐行处理)
根据您当前的策略,选项 1 会更容易,因为您可以保留需要匹配的 事物 的列表,并为每个 事物[=提供数据29=] 与该行一起查看它是否仍然匹配或应该重新开始。像
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
显然这意味着每个短语的表示将是有状态的并且是流程的活动部分,即负责处理每一行并处理多行匹配所需的任何内部状态。
这是我正在做的一项家庭作业,要求我从文件中读取数据并通过它进行解析,以找到某些关键短语或名称的行号和起始索引。该文件是在线托管的,所以我决定使用 URL class 来提取数据,而不是在本地下载文件,如果这会有所不同的话。
我可以毫无问题地提取数据、读取数据、查找行号、列号并对其进行排序。我挂断的是数据跨越两行。目前我正在使用 BufferedReader 逐行阅读并单独解析每一行,但这不包括短语被 newline/carriage return 分解的任何情况。我在想,也许我应该将所有数据读入一个字符串,这样我就可以解析它,寻找换行符可能会打断我的话的实例。
不确定这是否是解决此问题的正确方法。我还能怎么做?
编辑:数据集是嵌入在元素中的文本内容。任何行的末尾似乎都没有 \n 或 \r。
编辑:不是在寻找代码。只是一些额外的大脑可以帮助我以不同的方式思考这个问题。
编辑:也许这不是解决此问题的最佳方法...我们在这个 DS/Algo 课程的夏季课程初期,因此尚未测试效率。我抓取了当前行的最后一个字,并在下一行 运行 对 peak
执行 hasNext() 操作。我们只使用两个单词名称,否则更重的 RegEx 解决方案将被 war运行ted。
感谢大家的反馈。
我猜你可以试试正则表达式。 This 是 link 的原样。
它基本上是一个搜索引擎,允许您使用 "expression/algorithm" 指定您要搜索的内容。
满足您需要的示例可能是:
"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 的正则表达式。
如果搜索可以跨越多行,那么您没有行 - 您只有一个字符串(带有嵌入的换行符)。考虑到这一点来解决这个问题,一个简单的解决方案(不给你代码)将涉及首先使用正则表达式查找短语,然后用 \s+
替换短语中的所有空格并将其用作正则表达式。如果命中,查看命中前的所有测试:换行数是你的行号,最后一个换行后的字符数是你的列。
我认为你:
- 标准化您的关键短语和名称(将
"word\nplus\nword"
表示为 "line n has word, line n+1 has plus, line n+2 has word") - 将换行符作为匹配字符的一部分进行处理(逐字节处理而不是逐行处理)
根据您当前的策略,选项 1 会更容易,因为您可以保留需要匹配的 事物 的列表,并为每个 事物[=提供数据29=] 与该行一起查看它是否仍然匹配或应该重新开始。像
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
显然这意味着每个短语的表示将是有状态的并且是流程的活动部分,即负责处理每一行并处理多行匹配所需的任何内部状态。