我正在努力使用正则表达式(php 7.3)来解决这个问题:
Some Words [word] (foo@bar.com)
我可以通过以下方式得到它:
/.*?(\[.*?\]).*?(\(.*\))/is
但是我希望它先搜索“某些单词”,然后在方括号中搜索所有字母数字字符串,然后在方括号中搜索电子邮件地址。
答案 0 :(得分:1)
我的猜测是,您可能希望设计一个类似于以下内容的表达式:
(?is)([^[]+?)\s*\[([a-z0-9]*)\]\s*\(([^@]+@[^.]+\.[a-z0-9]{2,6})\)
具有或多或少的边界,但不确定。
该表达式在regex101.com的右上角进行了解释,如果您想探索/简化/修改它,在this link中,您可以观察到它如何与某些示例输入匹配,如果愿意的话。
$re = '/(?is)([^[]+?)\s*\[([a-z0-9]*)\]\s*\(([^@]+@[^.]+\.[a-z0-9]{2,6})\)/';
$str = 'Some Words [word] (foo@bar.com)';
preg_match_all($re, $str, $matches, PREG_SET_ORDER, 0);
var_dump($matches);
array(1) {
[0]=>
array(4) {
[0]=>
string(31) "Some Words [word] (foo@bar.com)"
[1]=>
string(10) "Some Words"
[2]=>
string(4) "word"
[3]=>
string(11) "foo@bar.com"
}
}
jex.im可视化正则表达式:
答案 1 :(得分:1)
看起来像这样:
/^(.*?)Static\h+Words\h+\[([A-Za-z0-9]+)\][^()]+\(([^@\s]+@[^@\s.]+\.[^@\s]+)\)$/
感谢您的帮助!
答案 2 :(得分:0)
如果要匹配“某些单词”,字母数字字符串和类似格式的电子邮件地址,可以使用:
^Some\h+Words\h+\[([A-Za-z0-9]+)\][^()]+\(([^@\s]+@[^@\s.]+\.[^@\s]+)\)$
说明
^
字符串的开头Some\h+Words\h+
匹配“某些单词”,其中\ h +是一个或多个水平空白字符\[([A-Za-z0-9]+)\]
匹配[
.... ]
,并且在第1组捕获之间匹配字母数字字符1次以上的字符[^()]+
使用negated character class而不是(
或)
匹配1次以上\(
匹配(
(
捕获组2
[^@\s]+@[^@\s.]+\.[^@\s]+
匹配“类似电子邮件”格式)
关闭群组\)
匹配)
$
字符串结尾