首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Regex匹配联系人组

Regex匹配联系人组
EN

Stack Overflow用户
提问于 2021-09-07 09:39:43
回答 2查看 66关注 0票数 3

我在编写PHP匹配模式以匹配字符串并将字符串拆分为需要的组时遇到了问题。

情况就是这样..。我有一个包含联系人的多个字符串:

+35 00000000, info@company.com, www.company.com

这会让我:

1组: +35 00000000,info@company.com,www.company.com

+35 00000000, +360000000, info@company.com, www.company.com

这会让我:

集团1: +35 00000000

2组: +36 00000000,info@company.com,www.company.com

info@company.com, www.company.com

这会让我:

集团1: info@company.com,www.company.com

+35 00000000, info@company1.com, www.company1.com, +36 00000000, info@company2.com, www.company2.com

这会让我:

Group 1: +35 00000000,info@company1.com,www.company1.com

集团2: +36 00000000,info@company2.com,www.company2.com

正如您所看到的,这些字符串可能是不同的。我需要做的是将这些字符串分成几组联系人,如下所示:

  • 通常以电话号码(+)开头,但并不总是,而且只能包含一个
  • 如果不提供电话,可以从网站链接或电子邮件开始。
  • 可以包含多组不同的公司。

所以一开始,我试着用电话号码和网站进行配对:

代码语言:javascript
运行
复制
((\+?[\d ]+)?(, )?(.*)(, )?(www\.\w+\.\w{2,})?)

但这并不完全符合。此外,还试图简化以电话号码开头的所有蚂蚁匹配组:

代码语言:javascript
运行
复制
(\+[\d ]+).*

但这匹配完整的字符串。

不得不说我是个大人物。我设法完成了基本的比赛,但这对我来说太难了。

模式的长度或低性能并不重要,因为这将是一次执行。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2021-09-07 09:56:37

您可以使用以下方法获得具有预期组的匹配。

代码语言:javascript
运行
复制
(?=[^\s,])(\+?\d(?:[\d\s]*\d)?)?(?:(?:,\s*)?(\S+@\S+)\b)?(?:(?:,\s*)?(www\.\S+)\b)?

regex演示

注意,(?=[^\s,])查找是用来避免匹配空字符串的。

详细信息

  • (?=[^\s,]) -下一个字符必须是逗号和空格以外的字符
  • (\+?\d(?:[\d\s]*\d)?)? -可选组1:一个可选的+,一个数字,然后是一个可选的零或多个数字和空白空间,然后是一个数字
  • (?:(?:,\s*)?(\S+@\S+)\b)? -可选的出现
    • (?:,\s*)? -逗号和零或多个空格的可选出现
    • (\S+@\S+)\b - Group 2:一个或多个非空白空间,@,一个或多个非空白空间,一个单词边界。

  • (?:(?:,\s*)?(www\.\S+)\b)? -可选的出现
    • (?:,\s*)? -逗号和零或多个空格的可选出现
    • (www\.\S+)\b -第3组:www.,一个或多个非空白空间,字界.
票数 2
EN

Stack Overflow用户

发布于 2021-09-07 09:54:12

您可以使用以下方法获得匹配:

代码语言:javascript
运行
复制
 (?:\+?\d+(?:\h+\d+)*,\h*)?[^\s@]+@[^\s@,]+,\h*www\.\S+|\+?\d+(?:\h+\d+)*

模式匹配:

  • (?:\+?\d+(?:\h+\d+)*,\h*)?匹配一个可选的+,然后用可选的空格匹配数字
  • [^\s@]+@[^\s@,]+匹配类似于电子邮件的模式,只匹配单个@
  • ,\h*www\.\S+匹配一个,,然后是www.和1+非空格字符
  • |
  • \+?\d+\h*\d+匹配电话号码类似的模式

Regex演示

或者使用交替的|为url和电子邮件地址匹配这两种方式。

代码语言:javascript
运行
复制
(?:\+?\d+(?:\h+\d+)*,\h*)?(?:[^\s@]+@[^\s@,]+,\h*www\.\S+|\h*www\.\S+,\h*[^\s@]+@[^\s@,]+)|\+?\d+(?:\h+\d+)*

Regex演示

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69085829

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档