我有一个需求,需要使用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 (.*))?$
将.*?
用于懒惰中继器(懒惰=非贪婪(