【发布时间】:2023-03-12 23:09:02
【问题描述】:
我希望能够在一个字符串中搜索各种单词,当我找到一个时,我想将那个点的字符串分成 3 部分(左、匹配、右),匹配的文本将被排除,并且该过程将继续使用新字符串 left+right。
现在,一旦我完成了所有匹配项,我需要通过在删除匹配的单词(或替换它们)处重新插入匹配的单词(或替换它们)来反转该过程。我从来没有在我的任何搜索中真正找到我想要的东西,所以我想我会在 SO 上征求意见。
如果这个问题需要进一步描述,请告诉我。
顺便说一句 - 目前,我有一个非常糟糕的算法,它用唯一的字符串标记替换匹配的文本,然后在所有匹配完成后用替换文本替换标记以进行适当的匹配。
这是目标:
one two three four five six
将匹配“三”替换为 foo(记住我们找到了三个,以及我们在哪里找到的)
one two four five six
|
three
匹配“二四”并防止它被任何东西匹配(为清楚起见进行了编辑)
one five six
|
two four
|
three
此时,您无法匹配例如“一二”
已找到所有匹配项,现在将它们的替换项放回(以相反的顺序)
one two four five six
|
three
one two foo four five six
有什么意义?防止一个匹配的替换文本被另一个模式匹配。 (所有模式在同一时间以相同的顺序运行每个处理的字符串)
我不确定语言是否重要,但在这种情况下我使用的是 Lua。
我会尝试改写,我有一个我想在给定字符串中找到的模式列表,如果我找到一个,我想删除字符串的那部分,这样它就不会被其他任何东西匹配,但我想跟踪我在哪里找到它,这样一旦我尝试匹配我的模式列表,我就可以在那里插入替换文本
这是一个相关的问题:
Shell script - search and replace text in multiple files using a list of strings
【问题讨论】:
-
那么算法完成后,字符串和你留下的一样吗?为什么首先需要删除字符串?你对这个结果做什么?可能有更简单的解决方案。请发布您使用的语言。
-
继续左+右到底是什么意思?假设原文是“abcdefgh”,而你的两个“词”是“cd”和“bef”,你会先拆分成“ab”-“cd”-“efgh”,然后在“abefgh”中搜索,然后找到“bef”,拆分成“a”-“bef”-“gh”,然后继续“agh”,没有找到?
-
好的,我用图表来改进问题
-
你怎么知道在你的例子中你得到的是“一巴五六”还是“一富五六”?关于其他匹配项中的匹配项的去向是否有明确的规则?
-
搜索词匹配将如何进行?术语“二四”跳过了原始输入中的一个词。 (我想我可能不得不删除我原来的答案......哈哈)