【问题标题】:Exclude substring from capture group从捕获组中排除子字符串
【发布时间】:2014-08-28 14:18:40
【问题描述】:

我正在使用一个采用 PCRE 兼容正则表达式的系统。

系统将捕获组 1 存储到数据库中。

我需要将带有分隔符的字符串的两半(不包括分隔符)捕获为单个捕获组。

给定字符串:“我想捕获这个位,但不是这个位,绝对是这个位”

我知道我可以创建一个像这样的正则表达式:

([A-Za-z\s]*) but not this bit([A-Za-z\s]*)

这会给我两个捕获组: 第 1 组:“我想捕捉这一点” 第 2 组:“当然还有这一点”

但是,我错过了一半的结果,因为第 1 组是所有存储的。

【问题讨论】:

  • 你为什么不试试这个regex101.com/r/lD8nJ2/2
  • 你缺少 g 修饰符,它告诉正则表达式在第一次匹配后继续,所以通常是 /([A-Za-z/s]*) but not this bit([A-Za-z/s]*)/g ,取决于你的 PCRE 系统,语法可能会有所不同
  • 一种方法是首先从输入中检查输入是否包含`但不包含此位. If it does then remove 但不包含此位`,然后捕获其余捕获组#1。
  • 您的意思是在模式中使用\s 而不是/s?这对于更大的问题并不重要,但正如所写的,由于and 之前的空格,第二部分将不匹配。我宁愿怀疑在您似乎正在工作的约束下,没有办法在一次操作中完成您想要的操作。
  • 不可能在一个捕获组中连接两个单独的子字符串。

标签: regex pcre


【解决方案1】:

您可能正在考虑分支重置功能。但这只是一个假设。

(?|([a-zA-Z\s]+) but not this bit|([a-zA-Z\s]+))

如 cmets 中所述,您可以使用正确的语法解决此问题。

([A-Za-z\s]+) but not this bit([A-Za-z\s]+)

【讨论】:

  • 是的,分支重置组很好,但它不是这项工作的工具。问题是第二组总是捕获一个空字符串,而您通过将/s 更改为\s 解决了这个问题。将* 更改为+ 也很好;如果可以改用+,则永远不要使用*。它只会让您面临性能不佳和无声的失败。
【解决方案2】:

结果证明我必须以编程方式执行此操作,而不是依赖单个正则表达式。事实证明,Casimir 是正确的,即使遵循 hwnd 的建议,也无法使用单个捕获组执行此操作,如下所示:

branch-reset does not result in a combined capture group

另外,是的,我有错误的斜线:-P

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-07-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多