【问题标题】:Replacing a single term in a regex pattern替换正则表达式模式中的单个术语
【发布时间】:2015-12-26 17:58:10
【问题描述】:

我在 Sphinx 中使用 regexp_filter 来替换术语

在大多数情况下,我可以这样做,例如拼写错误很容易:

regexp_filter = Backround => Background

甚至使用捕获组表示法进行交换:

regexp_filter = (Left)(Right) => \2\1

但是,在使用模式匹配来查找要替换的给定单词时,我遇到了更多麻烦:

 regexp_filter = (PatternWord1|PatternWord2)\W+(?:\w+\W+){1,6}?(SearchTerm)\b => NewSearchTerm

NewSearchTerm 将是我只想替换 \2 的术语(仅留下 \1 和模式的其余部分)。所以

所以如果我有文字'Pizza and Taco Parlor' 那么:

regexp_filter = (Pizza)\W+(?:\w+\W+){1,6}?(Parlor)\b => Store

将转换为'Pizza and Taco Store'

我知道在这种情况下 SearchTerm 是 /2 但不确定如何转换。我知道我可以附加例如/2s 使其成为复数,但实际上我该如何替换它,因为它只是一个由多个捕获的组,而我只想替换该组?

【问题讨论】:

  • 你想用什么替换它?给我们预期的输入 => 输出。如果这是您的要求,只替换一组是没有问题的。
  • @ndn 抱歉,如果不清楚,请更新答案并在此处发表评论:regexp_filter = (PatternWord1|PatternWord2)\W+(?:\w+\W+){1,6}?(SearchTerm )\b => 新搜索词

标签: regex sphinx capturing-group


【解决方案1】:

所以,如果我理解了这个问题。您有一个符合以下条件的字符串:

  1. 从 PattenWord1 或 PatternWord2 开始
  2. 紧跟大写单词
  3. 后面可能跟另一个 1 到 6 个字符之间的单词 -- 建议使用 [A-z] 而不是 \w+\W+
  4. 后跟“SearchTerm”

让我们以此为基准:

PatternWord1HelloSearchTerm

而您只想从字符串中替换 SearchTerm。

所以你需要另一个模式组来围绕你想要保留的所有内容:

regexp_filter = ((PatternWord1|PatternWord2)\W+(?:\w+\W+){1,6}?)(SearchTerm)\b => \1World

您的模式组匹配将是:

  1. PatternWord1Hello
  2. PatternWord1
  3. 搜索词

你的结果是:

PatternWord1HelloWorld

【讨论】:

  • 问题是我想保留所有内容,但要替换 SearchTerm。当我想替换 SearchTerm 时,我正在使用其余部分来简单地进行模式识别。根据我的(新添加的)示例,如果我有“Pizza and Taco Parlor”并且想要(在这种情况下)使 Parlor 等同于 Store,我将内部组设为捕获组。所以基本上我想以 \1\2NewTerm 结束(目前正在失败)
  • 您应该首先确保您使用的表达式与您想要的字符串匹配。我建议使用RegExr 来验证这一点。一旦你做对了,你应该像我推荐的那样玩那些模式组。
  • 事实上,我确实使用 Regex101 来确保它们匹配,但是您将先前的术语归为一组(PatternWord1 Hello)归为一组的建议奏效了。谢谢!
猜你喜欢
  • 2016-10-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-02-12
  • 1970-01-01
  • 2017-08-08
  • 1970-01-01
  • 2023-03-22
相关资源
最近更新 更多