正则表达式为“某些单词[word](foo@bar.com)”

时间:2019-07-29 00:25:38

标签: php regex

我正在努力使用正则表达式(php 7.3)来解决这个问题:

Some Words [word] (foo@bar.com)

我可以通过以下方式得到它:

/.*?(\[.*?\]).*?(\(.*\))/is

但是我希望它先搜索“某些单词”,然后在方括号中搜索所有字母数字字符串,然后在方括号中搜索电子邮件地址。

3 个答案:

答案 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"
  }
}

RegEx电路

jex.im可视化正则表达式:

enter image description here

答案 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]+匹配“类似电子邮件”格式
  • )关闭群组
  • \)匹配)
  • $字符串结尾

Regex demo