?和。*的目的是什么?在正则表达式\ K之前?

时间:2018-09-25 22:58:46

标签: regex regex-lookarounds

我有一个正则表达式,将它们之间带有.的单词匹配为潜在的网址,但不匹配前面带有@的单词,因为它们被认为是电子邮件。

这是我拥有的正则表达式:

(?:\@(https?:\/\/)?(\w+(\-*\w+)*\.)[a-zA-Z\.]+[\w+\/?\#?\??\=\%\&\-]+.*?)*\K(https?:\/\/)?(\w+(\-*\w+)*\.)[a-zA-Z\.]+[\w+\/?\#?\??\=\%\&\-]+

这不适用于最后一次出现的电子邮件。

例如,对于字符串

twitter.com facebook.com kamur@test.com ksou@uni.edu vimal@gsomething.com balaji@sweets.com john wayne <johnwayne@dc.com> 20,000.00

我希望匹配为twitter.comfacebook.com

但是它也匹配dc.com

1 个答案:

答案 0 :(得分:4)

在您的(?:\@(https?:\/\/)中,?中的https?:将与 http https 匹配。 ?的字面意思是字符s 0或1 。您在:中引用的https?:与文字:匹配,没什么特别的。

现在,区别在于,如果您的?:是在 non -逸出的括号之后,那么这意味着non-capturing group

  

已转义:\(?:不是非捕获组
  未逃脱:(?:一个非捕获组


问题的下一部分,.*?中的[\w+\/?\#?\??\=\%\&\-]+.*?指的是什么?

  • .将匹配任何字符
  • *量词,它将与您的. (任何字符) 0匹配无限次
  • *?使* 非贪婪internet search将为您提供很多有关如果您不知道的话,非贪婪匹配的信息。