Regex 正则表达式:如果某个组不存在,则将其视为可选组,但如果存在,则仅捕获之前的组
我需要使用正则表达式来解析来自用户的查询 例如,用户可以搜索具有以下查询格式的链接 我已经在上面提到了预期的捕获组值 我的正则表达式: “从(?[]+)(?:共享)(?[a-z]+)链接到(?[a-z]+)” 以下是我对以上三个问题的回答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
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
-文本链接到
-组“关键字”:1+字母或空格(?[a-z]+)
-文字文本来自
-组“名称”:任何0+字符,尽可能少(?*?)
-可选的(?:\s+shared\s+(?[a-z]+))?
-1+空格\s+
-文字子字符串共享
-1+空格\s+
-分组“时间”:1个以上字母(?[a-z]+)
-字符串/行的结尾$
[]+)(?:共享)(?[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]+))?$