正则表达式匹配联系人组
Regex matching groups of contacts
我在尝试编写 PHP 正则表达式匹配模式以匹配字符串并将其拆分为所需的组时遇到问题。
情况是这样的...我有多个联系人字符串:
+35 00000000, info@company.com, www.company.com
这会给我:
第 1 组: +35 00000000,信息@company.com,www.company.com
+35 00000000, +360000000, info@company.com, www.company.com
这会给我:
第 1 组:+35 00000000
第 2 组: +36 00000000,信息@company.com,www.company.com
info@company.com, www.company.com
这会给我:
第 1 组: 信息@company.com,www.company.com
+35 00000000, info@company1.com, www.company1.com, +36 00000000, info@company2.com, www.company2.com
这会给我:
第 1 组: +35 00000000,信息@company1.com,www.company1.com
第 2 组: +36 00000000,信息@company2.com,www.company2.com
如您所见,这些字符串可以不同。我需要做的是将这些字符串拆分为联系人组,其中:
- 通常以 phone 数字 (+) 开头,但并非总是如此并且只能包含一个
- 可以从网站 link 开始,如果未提供 phone,则可以从电子邮件开始
- 可以包含多个不同公司的组
所以起初我尝试匹配以 phone 数字开头并以网站结尾的组:
((\+?[\d ]+)?(, )?(.*)(, )?(www\.\w+\.\w{2,})?)
但这并不完全匹配。然后还尝试简化所有以 phone 数字开头的蚂蚁匹配组:
(\+[\d ]+).*
但这匹配完整的字符串。
不得不说我是 Regex 的大菜鸟。我设法做了基本的匹配,但这对我来说太难了。
模式的长度或低性能并不重要,因为这将是一次性执行。
您可以使用以下方式获得匹配项:
(?:\+?\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+
匹配 phone 数字,如模式
或使用交替 |
匹配 url 和电子邮件地址的两种方式
(?:\+?\d+(?:\h+\d+)*,\h*)?(?:[^\s@]+@[^\s@,]+,\h*www\.\S+|\h*www\.\S+,\h*[^\s@]+@[^\s@,]+)|\+?\d+(?:\h+\d+)*
您可以使用
获得与预期组的匹配
(?=[^\s,])(\+?\d(?:[\d\s]*\d)?)?(?:(?:,\s*)?(\S+@\S+)\b)?(?:(?:,\s*)?(www\.\S+)\b)?
参见regex demo。
请注意,(?=[^\s,])
前瞻用于避免匹配空字符串。
详情:
(?=[^\s,])
- 下一个字符必须是逗号和空格以外的字符
(\+?\d(?:[\d\s]*\d)?)?
- 一个可选的第 1 组:一个可选的 +
,一个数字,然后是可选的零个或多个数字和空格,然后是一个数字
(?:(?:,\s*)?(\S+@\S+)\b)?
- 可选的出现
(?:,\s*)?
- 可选的逗号和零个或多个空格
(\S+@\S+)\b
- 第 2 组:一个或多个非空白,@
,一个或多个非空白,一个词边界
(?:(?:,\s*)?(www\.\S+)\b)?
- 可选的出现
(?:,\s*)?
- 可选的逗号和零个或多个空格
(www\.\S+)\b
- 第 3 组:www.
,一个或多个非空格,单词边界。
我在尝试编写 PHP 正则表达式匹配模式以匹配字符串并将其拆分为所需的组时遇到问题。
情况是这样的...我有多个联系人字符串:
+35 00000000, info@company.com, www.company.com
这会给我:
第 1 组: +35 00000000,信息@company.com,www.company.com
+35 00000000, +360000000, info@company.com, www.company.com
这会给我:
第 1 组:+35 00000000
第 2 组: +36 00000000,信息@company.com,www.company.com
info@company.com, www.company.com
这会给我:
第 1 组: 信息@company.com,www.company.com
+35 00000000, info@company1.com, www.company1.com, +36 00000000, info@company2.com, www.company2.com
这会给我:
第 1 组: +35 00000000,信息@company1.com,www.company1.com
第 2 组: +36 00000000,信息@company2.com,www.company2.com
如您所见,这些字符串可以不同。我需要做的是将这些字符串拆分为联系人组,其中:
- 通常以 phone 数字 (+) 开头,但并非总是如此并且只能包含一个
- 可以从网站 link 开始,如果未提供 phone,则可以从电子邮件开始
- 可以包含多个不同公司的组
所以起初我尝试匹配以 phone 数字开头并以网站结尾的组:
((\+?[\d ]+)?(, )?(.*)(, )?(www\.\w+\.\w{2,})?)
但这并不完全匹配。然后还尝试简化所有以 phone 数字开头的蚂蚁匹配组:
(\+[\d ]+).*
但这匹配完整的字符串。
不得不说我是 Regex 的大菜鸟。我设法做了基本的匹配,但这对我来说太难了。
模式的长度或低性能并不重要,因为这将是一次性执行。
您可以使用以下方式获得匹配项:
(?:\+?\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+
匹配 phone 数字,如模式
或使用交替 |
(?:\+?\d+(?:\h+\d+)*,\h*)?(?:[^\s@]+@[^\s@,]+,\h*www\.\S+|\h*www\.\S+,\h*[^\s@]+@[^\s@,]+)|\+?\d+(?:\h+\d+)*
您可以使用
获得与预期组的匹配(?=[^\s,])(\+?\d(?:[\d\s]*\d)?)?(?:(?:,\s*)?(\S+@\S+)\b)?(?:(?:,\s*)?(www\.\S+)\b)?
参见regex demo。
请注意,(?=[^\s,])
前瞻用于避免匹配空字符串。
详情:
(?=[^\s,])
- 下一个字符必须是逗号和空格以外的字符(\+?\d(?:[\d\s]*\d)?)?
- 一个可选的第 1 组:一个可选的+
,一个数字,然后是可选的零个或多个数字和空格,然后是一个数字(?:(?:,\s*)?(\S+@\S+)\b)?
- 可选的出现(?:,\s*)?
- 可选的逗号和零个或多个空格(\S+@\S+)\b
- 第 2 组:一个或多个非空白,@
,一个或多个非空白,一个词边界
(?:(?:,\s*)?(www\.\S+)\b)?
- 可选的出现(?:,\s*)?
- 可选的逗号和零个或多个空格(www\.\S+)\b
- 第 3 组:www.
,一个或多个非空格,单词边界。