当前位置: 首页 > 知识库问答 >
问题:

如何让捕获组“吸收”它之前/之后的空白而不捕获它?

锺离德庸
2023-03-14

这里有一个正则表达式。试试下面的字符串,我面临的问题是,在第一个组之后,每个捕获组的开头都有一个额外的空格。我需要匹配空白,但不需要捕捉它们。

正则表达式:

^(\/[a-zA-Z0-9]+)?(\s~[a-zA-Z]+)?([\w\s'()-]+)?((?:\s~[a-zA-Z]+){0,2})?$

在上面的链接上查看它会使理解变得更简单。

这些是您可以一个接一个地粘贴到测试字符串区域中的一些字符串:

/test ~example matches ~extra ~space
this too has an extra ~space ~matched
/like wise for this
/and ~this

查看匹配组区域,注意在第1组之后,组之间的前1个空格被捕获。

我想做的是:

对于第一个和第二个捕获组,我希望他们检测到一个后续空间并吸收它,但不捕获它,这样第三个捕获组就不会检测并捕获额外的空间。对于第四个捕获组,我希望它检测到前面的空间并吸收它,但不捕获它。

我所说的吸收是指空间被“移除”,从某种意义上说,第三个捕获组不会意识到它的存在。

我怎么能这么做呢?

谢谢

共有3个答案

奚晟
2023-03-14

试试这个正则表达式

^(\/[a-zA-Z0-9]+)?\s?(~[a-zA-Z]+)?\s*([\w\s'()-]+)?\s?((?:~[a-zA-Z]+\s?){0,2})?$
斜成济
2023-03-14

我想这就是你想要的:

^(\/[a-zA-Z0-9]+)?(?:(\s~[a-zA-Z]+)\s)?([\w\s'()-]+)?(?:\s((?:~[a-zA-Z]+\s?){0,2}))?$
訾淇
2023-03-14

这是我想出的正则表达式-

^(\/[a-zA-Z0-9]+)?(?:\s)?(~[a-zA-Z]+)?(?:\s)?([\w\'()\-\s]+)?(?:\s(~[a-zA-Z]+))?(?:\s(~[a-zA-Z]+))?$

按照要求将正则表达式分成2部分——

对于第一个和第二个捕获组,我希望他们检测到一个后续空间并吸收它,但不捕获它,这样第三个捕获组就不会检测并捕获额外的空间。

第一组和第二组的正则表达式-

(\/[a-zA-Z0-9]+)?(\s~[a-zA-Z]+)?

所以,在第一次和第二次捕获组之后,我添加了一个非捕获(?:\s)。这允许第三个捕获组不吸收前面的空间。这是我的正则表达式-

(\/[a-zA-Z0-9]+)?(?:\s)?(~[a-zA-Z]+)?(?:\s)?

对于第四个捕获组,我希望它检测到前面的空间并吸收它,但不捕获它。

你的正则表达式

((?:\s~[a-zA-Z]+){0,2})?

在这里,一个显而易见的解决方案是只捕获文本部分([a-zA-Z]),而不捕获\s部分。像这样的,

(?:(?:\s(~[a-zA-Z]+)){0,2})?
         ^^^^^^^^^^ Capturing only this.

但这是一个重复的捕获组,在这个组中,您实际上是在旧元素的基础上捕获一个新元素。基本上,重复捕获组只捕获最后一次迭代。所以如果你想匹配-

“~space~matched”,它将只捕获最后一个“~matched”

一个解决方案是,既然你在检查{0,2},你可以显式地检查它两次,就像这样-

(?:\s(~[a-zA-Z]+))?(?:\s(~[a-zA-Z]+))?

但是,如果以后对{0,2}的要求发生变化,那么最好的解决方案是捕获前面的空格并将捕获的组分开为空格。

->  OUTPUT - when I run this regex for the given strings in JavaScript-
["/test ~example matches ~extra ~space", "/test", "~example", "matches", "~extra", "~space", index: 0, input: "/test ~example matches ~extra ~space"] (index):18
["this too has an extra ~space ~matched", undefined, undefined, "this too has an extra", "~space", "~matched", index: 0, input: "this too has an extra ~space ~matched"] (index):18
["/like wise for this", "/like", undefined, "wise for this", undefined, undefined, index: 0, input: "/like wise for this"] (index):18
["/and ~this", "/and", "~this", undefined, undefined, undefined, index: 0, input: "/and ~this"] 

希望这有所帮助。

 类似资料:
  • 本文向大家介绍PHP正则表达式之捕获组与非捕获组,包括了PHP正则表达式之捕获组与非捕获组的使用技巧和注意事项,需要的朋友参考一下 今天遇到一个正则匹配的问题,忽然翻到有捕获组的概念,手册上也是一略而过,百度时无意翻到C#和Java中有对正则捕获组的特殊用法,搜索关键词有PHP时竟然没有相关内容,自己试了一下,发现在PHP中也是可行的,于是总结一下,分享的同时也希望有大神和细心的学习者找到我理解中

  • 我试图捕获关键字后面的文本,一直到行的结尾。我花了很多时间在堆栈交换和在线regex测试人员上,试图找到正确的组合。 我非常接近,但我的输出继续捕获新的行。regex101.com声明.*?匹配任何字符(换行符除外)。我很难理解为什么它总是捕获换行符。 下面是我正在搜索的文本的一个片段: Blahblahlah\n公司:BALDWIN LINE CONST OF MD Inc\n联系人姓名:STE

  • 我正在使用< code>ControllerAdvice来处理我的应用程序中的异常,它工作正常。然而,我开始使用Spring Security,通常我应该在下面的方法中捕获AuthenticationExceptions。 当我删除异常处理类时,我可以在此方法中捕获AuthenticationException。但是,当我使用异常处理机制时,它会在方法之前捕获AuthenticationExcep

  • 本文向大家介绍如何让事件先冒泡后捕获?相关面试题,主要包含被问及如何让事件先冒泡后捕获?时的应答技巧和注意事项,需要的朋友参考一下 参考回答: 在DOM标准事件模型中,是先捕获后冒泡。但是如果要实现先冒泡后捕获的效果,对于同一个事件,监听捕获和冒泡,分别对应相应的处理函数,监听到捕获事件,先暂缓执行,直到冒泡事件被捕获后再执行捕获之间。

  • 我有一个存储过程似乎没有正确记录错误。 代码有错误,但 catch 块似乎未生效。 try块相当长,但错误部分很简单,并且在最后出现,所以我已经对此进行了预测。 proc失败的错误是我们的老朋友“列名或提供的值的数量与表定义不匹配”。我已经修复了这个错误 - 这是一个愚蠢的懒惰错误 - 但我感到困惑为什么我的错误日志记录过程似乎没有工作 - 没有行入到我的 ExtractsErrorLog 表中。

  • 问题内容: 我想将预览层“流式传输”到我的服务器,但是,我只希望发送特定的帧。基本上,我想拍摄AVCaptureVideoPreviewLayer的快照,将其缩放到28 * 28,将其转换为强度数组,然后将其发送到我的python后端处理其余部分的套接字层。 这里的问题是AVCapturePhotoOutput的捕获功能异常缓慢。我不能重复调用该函数。更不用说它总是使相机的快门声哈哈。 另一个问题