正则表达式:如果一个组不存在,则将其视为可选,但如果存在,则仅捕获之前的组



我有一个需求,需要使用Regex来解析来自用户的查询。

例如,用户可以搜索具有等查询格式的链接

link to <keyword> from <person name>
link to <keyword> from <person name> shared <time>

例如

link to connect form from sandeep agarwal => keyword=connect form, person-name=sandeep agarwal
link to sharepoint ppt from mathews => keyword=sharepoint ppt, person-name=mathews 
link to sharepoint design from Gronvik yesterday => keyword=sharepoint design, person-name=Gronvik, time=yesterday

我已经在上面提到了预期的捕获组值。

我的Regex:

"从(?[]+((?:共享((?[a-z]+(链接到(?[a-z]+(">

以下是我对以上3个查询的回复

Match 1
Full match = link to connect link from sandeep agarwal
Group `keyword` = connect form
Group `name`= sandeep agarwal   
Match 2
Full match = link to sharepoint git from sapna
Group `keyword` = sharepoint ppt
Group `name`= mathews           
Match 3 - **This is where things go wrong**
Full match = link to sharepoint git from sapna grover shared yesterday
Group `keyword` = sharepoint design
Group `name`= Gronvik shared yesterday

在上面提到的第三个响应中,我得到了"Gronvik共享"昨天"作为组"名称",但理想的情况是name=Gronvik和time="昨天"我尝试了许多方法积极的前瞻开始破裂。

关键字"shared"可能不会每次都出现,但当它出现时目前,我的"name"组应该捕获名称,直到共享(不包括it(和组"时间"应仅在存在"共享"的情况下捕获时间在查询中。如果有人能指出正确的方向。

您可以使用

(?i)^Links+tos+(?<keyword>[a-z ]+) from (?<name>.*?)(?:s+shareds+(?<time>[a-z]+))?$

请参阅regex演示。

详细信息

  • (?i)-不区分大小写标志
  • ^-字符串的开头(如果启用了m多行选项,则为行(
  • Link to -文字
  • (?<keyword>[a-z ]+)-组"关键字":1+个字母或空格
  • from -文字
  • (?<name>.*?)-组"名称":任意0+个字符,尽可能少
  • (?:s+shareds+(?<time>[a-z]+))?-的可选序列
    • s+-1+空白
    • shared-文字子字符串
    • s+-1+空白
    • (?<time>[a-z]+)-组"时间":1+个字母
  • $—字符串/行的末尾

link to (.*?) from (.*?)( shared (.*))?$

.*?用于懒惰中继器(懒惰=非贪婪(

最新更新