【问题标题】:Is it possible to assess the contents of a capture group again?是否可以再次评估捕获组的内容?
【发布时间】:2019-07-12 14:08:23
【问题描述】:

出于好奇(考虑到我花在这上面的时间),我想看看是否可以使用 Sublime Text 3 中的替换功能和正则表达式进行转换

style="bla: bla; bla:bla;"

进入

bla:bla;
bla:bla;

我可以只为 bla: bla; bla:bla; 创建一个捕获,而无需 style 或引号:

(?<=\sstyle=")(.*)(?=")https://regex101.com/r/tctJti/1

但在那之后,我被困住了。我也尝试过单独捕获每个bla:bla,但这似乎没有帮助,因为捕获组只保存它捕获的最后一个东西:

\s*style="((.*?;)*)"https://regex101.com/r/tctJti/2

我需要的是能够告诉 sublime 从我的第一个示例中忽略该捕获组之外的所有内容,然后在该单个捕获组中查找分号,并将其转换为换行符。这样的事情是否可能,或者根据定义,这是否是一个两步转换?

【问题讨论】:

  • 出于好奇,尝试\s*(?:\G(?!\A)\s*|style=")(?:([^;"]+;)|") 并替换为$1\n
  • 是的,这也很好用。唯一的问题是它总是删除style= 之前的任何空格,这可能并不总是可取的。不过,请随意将其写成答案,因为它确实解决了我的问题。
  • 那么regex101.com/r/y7VU2i/1 就可以了。不过不需要重复答案。
  • 说实话,您的方法略有不同,所以我认为这是一个不同的答案。这两种答案可能都有各自的优缺点。虽然我无法识别它们,但其他人可能会看到两者之间的明显区别,并评论为什么其中一个更好。

标签: regex sublimetext3 pcre


【解决方案1】:

您可以使用这个 PCRE 正则表达式来匹配:

(?:\bstyle="|(?!^)\G)([^;"]+;?)\s*(?:"$)?

并将其替换为:

$1\n

RegEx Demo

\G 在前一个匹配的末尾或第一个匹配的字符串的开头断言位置。通过放置(?!^),我们确保\G 在行首不匹配。

【讨论】:

  • 感谢您让我走上正轨。不过,您的答案并非 100% 准确。在我的问题中,我要求在列表末尾包含分号。您的解决方案将它们删除。这应该适用于我的测试:(?:\bstyle="|(?!^)\G)(.+?;)\s*(?:[^;"]*")?。我仍然不太确定这是如何实现的,但至少现在我可以做一些实验。再次感谢。
  • 为了完整起见,对我之前的评论进行了编辑:如果最后一个分号不存在,我的正则表达式不包括列表中的最后一项。这应该会更好:(?:\bstyle="|(?!^)\G)([^;"]+;?)\s*(?:"$)?
  • 哦,是的,这很好。我已按照您的建议进行了编辑。谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-11-20
  • 2019-08-12
  • 2016-02-19
  • 2021-10-10
  • 1970-01-01
相关资源
最近更新 更多