【问题标题】:RegEx Capturing indefinitely repeating patterns with specific backreferences?正则表达式捕获具有特定反向引用的无限重复模式?
【发布时间】:2017-01-15 23:29:46
【问题描述】:

我正在尝试找到一个与 TextWrangler 一起使用的好的正则表达式,以将任务描述解析为 Rememberthemilk.com 格式:这样一行:

Example task section 1 section tomorrow section tagone tagtwo tagthree tagfour 

谁转换成RTM格式:

Example task !1 ^tomorrow #tagone #tagtwo #tagthree #tagfour 

现在这让我想到一个问题,如何在反向引用中使用正确的语法来捕获无限重复的模式?

我一直在尝试这个正则表达式:

^([\w ]+) section (\d) section (\w+) section ((\w+) )+$

这似乎捕获了输入文本的格式,但我只是不知道如何在反向引用中进行转换?

\1 !\2 ^\3 #(???)

我如何做到这一点?

【问题讨论】:

  • 替换字符串中的每个字符只使用一次。没有办法为最后一组的每场比赛重复“#”。如果总是有相同数量的标签,您可以单独匹配它们,但我假设情况并非如此。
  • 我不认为你可以通过替换和反向引用来实现这一点。使用更成熟的编程语言执行此操作可能会让您这样做(例如,C# 能够访问特定组的所有捕获)。示例:gist.github.com/Porges/…

标签: regex textwrangler find-replace


【解决方案1】:

捕获量化的构造,不要量化捕获组。

这里我们还在内部部分使用“仅分组”括号(无捕获组)并捕获外部以获得干净的结果:

([\w ]+) section (\d) section (\w+) section ((?:\w+\s?)+)

你想要重复的构造捕获(),“重复组”没有意义,在大多数引擎中,只会捕获匹配组的最后一个结果。 (尽管一些正则表达式引擎将允许重复捕获组记住所有子匹配项(例如 .NET))

演示:https://regex101.com/r/y3CryR/2

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-09-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-23
    • 2017-12-30
    • 1970-01-01
    相关资源
    最近更新 更多