1

我正在努力使用将抓住这些的正则表达式(php 7.3):

Static Words [word] (foo@bar.com)
RE: Static Words [word] (foo@bar.com)
FW: Static Words [word] (foo@bar.com)
FW: FW: Static Words [word] (foo@bar.com)

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

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

但我希望它搜索“静态单词”,然后是方括号中的任何字母数字字符串,然后是圆括号中的电子邮件地址。

请注意,它们可能是“静态词”中的文本,因为这是电子邮件主题行,可以转发或回复。

这是我最终想出的,寻找反馈:

/^(.*?)Static\h+Words\h+\[([A-Za-z0-9]+)\][^()]+\(([^@\s]+@[^@\s.]+\.[^@\s]+)\)$/
4

3 回答 3

1

我的猜测是您可能想要设计一个表达式,有点类似于:

(?is)([^[]+?)\s*\[([a-z0-9]*)\]\s*\(([^@]+@[^.]+\.[a-z0-9]{2,6})\)

有或多或少的界限,但不确定。


该表达式在regex101.com的右上角面板上进行了说明,如果您希望探索/简化/修改它,并且在此链接中,您可以查看它如何与一些示例输入匹配,如果您愿意的话。


测试

$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可视化正则表达式:

在此处输入图像描述

于 2019-07-29T00:37:31.363 回答
1

如果您想匹配“一些单词”、字母数字字符串和类似格式的电子邮件地址,您可以使用:

^Some\h+Words\h+\[([A-Za-z0-9]+)\][^()]+\(([^@\s]+@[^@\s.]+\.[^@\s]+)\)$

解释

  • ^字符串的开始
  • Some\h+Words\h+匹配“一些单词”,其中 \h+ 是一个或多个水平空白字符
  • \[([A-Za-z0-9]+)\]匹配[....]并在第 1 组捕获之间匹配 1+ 次字母数字字符
  • [^()]+(不匹配或)使用否定字符类匹配 1 次以上
  • \(匹配(
  • (捕获组 2
    • [^@\s]+@[^@\s.]+\.[^@\s]+匹配“类似电子邮件”的格式
  • )关闭组
  • \)匹配)
  • $字符串结束

正则表达式演示

编辑

如果要匹配所有“单词”并且匹配不应以空格开头,则可以使用重复模式来匹配 1+ 个非空白字符,后跟 1+ 个水平空白字符(?:\S+\h+)

^(?:\S+\h+)+\[([A-Za-z0-9]+)\][^()]+\(([^@\s]+@[^@\s.]+\.[^@\s]+)\)$

正则表达式演示

于 2019-07-29T06:14:04.303 回答
0

看起来像这样:

/^(.*?)Static\h+Words\h+\[([A-Za-z0-9]+)\][^()]+\(([^@\s]+@[^@\s.]+\.[^@\s]+)\)$/

谢谢您的帮助!

于 2019-07-29T13:46:51.237 回答