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

Regex 正则表达式:如果某个组不存在,则将其视为可选组,但如果存在,则仅捕获之前的组,regex,search,regex-lookarounds,regex-group,regex-greedy,Regex,Search,Regex Lookarounds,Regex Group,Regex Greedy,我需要使用正则表达式来解析来自用户的查询 例如,用户可以搜索具有以下查询格式的链接 我已经在上面提到了预期的捕获组值 我的正则表达式: “从(?[]+)(?:共享)(?[a-z]+)链接到(?[a-z]+)” 以下是我对以上三个问题的回答 Match 1 Full match = link to connect link from sandeep agarwal Group `keyword` = connect form Group `name`= sandeep agarwal Ma

我需要使用正则表达式来解析来自用户的查询

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

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

我的正则表达式:

“从(?[]+)(?:共享)(?[a-z]+)链接到(?[a-z]+)”

以下是我对以上三个问题的回答

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”可能不是每次都出现,而是每次都出现时 目前,我的“姓名”组应捕获姓名,直至共享(不包括 it)和组“时间”应仅在存在“共享”时捕获时间 在查询中。如果有人能指出这一点,那将非常有帮助 正确的方向

从(.*)(共享(.*)链接到(.*)?$

对于惰性中继器(惰性=非贪婪)使用
*?

您可以使用

(?i)^Link\s+to\s+(?<keyword>[a-z ]+) from (?<name>.*?)(?:\s+shared\s+(?<time>[a-z]+))?$
(?i)^Link\s+到\s+(?[a-z]+)从(?.*?)(:\s+共享的\s+(?[a-z]+)$

详细信息

  • (?i)
    -不区分大小写标志
  • ^
    -字符串的开头(如果启用了
    m
    多行选项,则为行)
  • 链接到
    -文本
  • (?[a-z]+)
    -组“关键字”:1+字母或空格
  • 来自
    -文字文本
  • (?*?)
    -组“名称”:任何0+字符,尽可能少
  • (?:\s+shared\s+(?[a-z]+))?
    -可选的
    • \s+
      -1+空格
    • 共享
      -文字子字符串
    • \s+
      -1+空格
    • (?[a-z]+)
      -分组“时间”:1个以上字母
  • $
    -字符串/行的结尾

您的模式格式不正确,因为
[]+)(?:共享)(?[a-z]
是单个大字符类。请尝试
(?i)^链接到(?[a-z]+)from(?..*?(?:\s+共享)?\s+(?[a-z]+)?$
,请参阅@WiktorStribiżew谢谢。您的演示似乎正在运行。我在运行它时遇到了问题。我使用了该站点来测试我的正则表达式。您能帮助我理解为什么它可能与您的演示站点上的工作方式不同吗?我添加了一个答案,并进行了完整的解释和演示。
^
$
锚和正确的可选分组是至关重要的。这个答案中的regex演示链接对于第一个输入是错误的。它选择了时间组下的人的姓氏。请检查一下。我用c#console应用程序测试了它,第一个案例也失败了。我假设它在
https://regex101.com/
,然后它将在控制台应用程序也是。很长一段时间以来,我一直将该站点用作游戏场地,我可以信任它在真实场景中的输出。@当您测试.net正则表达式时,您应该重新考虑您对regex101.com的信任,因为该站点不支持.net正则表达式语法。请尝试
[\p{L}-[a]]+
regex反对
bca
string,它在regex101.com上不起作用。谢谢,它现在起作用了。想知道为什么\h+起作用,为什么\s+不能起作用。因为
\h
在.net regex中不受支持。它匹配水平空白。在.net中,它是
[\p{Zs}\t]
。这似乎在
regexstorm.net/tester上给出了正确的结果,但在
https://regex101.com/
。我用创建C#控制台应用程序对其进行了测试,它也出现了失败的情况。您介意运行一下吗
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
(?i)^Link\s+to\s+(?<keyword>[a-z ]+) from (?<name>.*?)(?:\s+shared\s+(?<time>[a-z]+))?$