代码之家  ›  专栏  ›  技术社区  ›  user3649739

替换正则表达式模式中的单个术语

  •  0
  • user3649739  · 技术社区  · 9 年前

    我在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,但不确定如何转换。我知道我可以加上例如/2,使其复数,但实际上我如何替换它,因为它只是一个由几个捕获组组成的捕获组,而我只想替换该组?

    1 回复  |  直到 9 年前
        1
  •  0
  •   cynicaljoy    9 年前

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

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

    让我们将此作为基线:

    模式文字1 HelloSearchTerm

    您只需要从字符串中替换SearchTerm。

    因此,您需要围绕您想要保留的所有内容的另一个模式组:

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

    您的模式组匹配将是:

    1. 图案文字1问候语
    2. 图案文字1
    3. 搜索术语

    您的结果是:

    模式Word1HelloWorld

    推荐文章