【问题标题】:Backrefence without matching it on find result在查找结果中不匹配的反向引用
【发布时间】:2020-09-06 12:37:16
【问题描述】:

考虑文本结构

 (Title)[#1Title-link]
      (Chapter1)[#Chapter1-link]
      (Chapter2)[#Chapter2-link]
      (Chapter3)[#Chapter3-link]

如何在不匹配查找结果的情况下反向引用 [#Title-link]。我想改变

      (Chapter1)[#Chapter1-link] => (Chapter1)[#1Title-link-Chapter1-link]
      (Chapter2)[#Chapter2-link] => (Chapter2)[#1Title-link-Chapter2-link]
      (Chapter3)[#Chapter3-link] => (Chapter3)[#1Title-link-Chapter3-link]

我尝试使用并找到

(\(Title\)\[(.*?)])([\s\S]*?\[)#(\D.*?\])

然后替换为

$1$3$2-$4

但是这里的问题每次查找只突出显示一次,而且我有很多章节效率太低,无法一一替换。 制作一个固定的标题也不好,因为我有多个具有相同结构的文件。

这在正则表达式中可能吗?欢迎任何解决方案或替代方案。

【问题讨论】:

    标签: regex regex-group backreference


    【解决方案1】:

    您可以先进行搜索以获取正确的替换字符串,然后使用该替换字符串执行后续替换操作。您没有指定您使用的语言,所以这里是 Python 中的代码(其中对组 1 的反向引用是 \1,而不是更常见的 $1):

    import re
    
    text = """(Title)[#1Title-link]
          (Chapter1)[#Chapter1-link]
          (Chapter2)[#Chapter2-link]
          (Chapter3)[#Chapter3-link]"""
    
    m = re.search(r'(?:\(Title\)\[#([^\]]*)\])', text)
    assert(m) # that we have a match
    substitution = m.group(1)
    text = re.sub(r'\[#Chapter([^\]]*)\]', r'[#' + substitution + r'-Chapter\1' + ']', text)
    print(text)
    

    打印:

    (Title)[#1Title-link]
          (Chapter1)[#1Title-link-Chapter1-link]
          (Chapter2)[#1Title-link-Chapter2-link]
          (Chapter3)[#1Title-link-Chapter3-link]
    

    See Regex Demo 1 for getting the substitution string

    See Regex Demo 2 for making the subsitutions

    【讨论】:

      猜你喜欢
      • 2018-01-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-12-14
      • 1970-01-01
      • 2021-02-05
      相关资源
      最近更新 更多