【问题标题】:Regex - Capturing an optional string正则表达式 - 捕获可选字符串
【发布时间】:2017-08-10 18:19:05
【问题描述】:

我想在一个句子中捕获一组特定的字符串,例如:

Agent/889 (SIP/1011 from SIP/1011) blablabla (Not in use) blablabla (last was 6 secs ago)

Agent/889 (SIP/1011 from SIP/1011) blablabla (Unavailable) blablabla

我在这个正则表达式中获得了我想要的所有信息:

Agent\/(\d{3})\s\(SIP\/(\d{4}).*\).*(In use|Not in use|Unavailable)\).*

但是,我想获得一个 #4 组,该组捕获(如果存在)“last was # secs ago”中的内容。我试过这样的正则表达式:

Agent\/(\d{3})\s\(SIP\/(\d{4}).*\).*(In use|Not in use|Unavailble)\).*(last was \d{1,} secs ago)?

但是#4 组总是在数组中得到一个空白值,即使字符串包含正则表达式中的文本。我正在使用PHP的preg_match_all函数,在本站模拟:PHP Live Regex.

【问题讨论】:

  • 顺便说一句,你在 Unavailable 中有一个类型

标签: php regex pcre


【解决方案1】:

你可以使用下面的正则表达式

Agent\/(\d{3})\s\(SIP\/(\d{4}).*\).*(In use|Not in use|Unavailable)\)(?:\w*\s*)*(\(last was \d{1,} secs ago\))?

检查demo herehere

【讨论】:

  • 非常好!当字符串“last was”不存在时,我做了一些更改,不捕获新行:Agent\/(\d{3})\s\(SIP\/(\d{4}).*\).*(In use|Not in use|Unavailable)\)(?:\w*[\r\t\f ]*)*(\(last was \d{1,} secs ago\))?
猜你喜欢
  • 2022-06-11
  • 2012-08-20
  • 2019-11-06
  • 2016-12-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-11-21
  • 1970-01-01
相关资源
最近更新 更多