正则表达式在遇到分号后停止解析

时间:2018-06-21 13:39:02

标签: c# regex

我正在使用此正则表达式从分号分隔的字符串中解析URL。

\b(?:https?:|http?:|www\.)\S+\b

如果我的输入文本采用以下格式,则效果很好:

    "Google;\"https://google.com\""
//output - https://google.com
    "Yahoo;\"www.yahoo.com\""
//output - www.yahoo.com

但是在这种情况下,它给出的字符串不正确

"https://google.com;\"https://google.com\"" 
//output - https://google.com;\"https://google.com

遇到';'时如何停止解析?

3 个答案:

答案 0 :(得分:1)

我个人只是修改正则表达式以使其专门用于URL,并向https://协议和www量词添加一些条件。使用\ S +可能有点麻烦,因为它将捕获每个非空白字符,而在URL中,该字符会限制您可以使用的字符。

这样的事情应该可以很好地满足您的特定需求。

(https?:\/{2})?([w]{3}.)?\w+\.[a-zA-Z]+

这为http(也是可选的s协议)设置了条件,然后://将紧随其后。然后,它将抓取尽可能多的所有字母,数字和下划线,直到.,然后是最后一个字符集结束为止。如果愿意,可以将[a-zA-Z]字符集替换为一组明确的域。

答案 1 :(得分:1)

看看您的示例,我将匹配引号之间的任何URL。像这样:

(?<=")(?:https?:|www\.)[^"]*

You can try it out here

或者就像其他人所说的那样,使用string.Split用分号字符分隔输入字符串,然后顺序检查每个字符串是否符合您的期望。

答案 2 :(得分:1)

对于示例数据,您可以使用正向先行(?=)和正向先行(?<=)

(?<=")(?:https?:|www\.).+?(?=;?\\")

那会匹配

  • (?<=")肯定地说是在左边是双引号。
  • (?:https?:|www\.)将http与可选的s或www匹配。
  • .+?匹配任意字符一次或多次非贪婪
  • (?=;?\\")积极前瞻,断言其后是可选的;,后跟\"