正则表达式 - 将组1作为“完全匹配”/组0

时间:2017-02-22 02:19:57

标签: php regex preg-match

鉴于以下示例,我想获取电子邮件地址

Eg. 1: some standard text.   Bugs Bunny bugs@gmail.com 0411111111 more standard text 
Eg. 2: some standard text.   Bugs The Bunny bugs@gmail.com 0411111111 more standard text
Eg. 3: some standard text.   Bugs-Bunny bugs.bunny@gmail.com 0411111111 more standard text
Eg. 4: some standard text.   Bugs bugs.bunny@gmail.com +6141 111 111 more standard text
Eg. 5: some standard text.   Bugs o'Bunny bugs@gmail.com 0411111111 more standard text 

这样做:(?<=some standard text. )(?:.*?)([^\s]+@[^\s]+) https://regex101.com/r/A29hjE/9

但是电子邮件地址在第1组中。我需要将它作为第0组或完全匹配,因为这个正则表达式将由某些代码动态创建,其中所有其他正则表达式都会产生完全匹配的结果。

我对群组了解不多,但我知道我需要在some standard text.位之后的第一个电子邮件地址,就像我说的那样,它需要完全匹配。

3 个答案:

答案 0 :(得分:1)

你可以这样做:

$lines = array(
"some standard text.   Bugs Bunny bugs@gmail.com 0411111111 more standard text ",
"some standard text.   Bugs The Bunny bugs@gmail.com 0411111111 more standard text",
"some standard text.   Bugs-Bunny bugs.bunny@gmail.com 0411111111 more standard text",
"some standard text.   Bugs bugs.bunny@gmail.com +6141 111 111 more standard text",
"some standard text.   Bugs o'Bunny bugs@gmail.com 0411111111 more standard text ",
);
foreach($lines as $line) {
    preg_match('/some standard text..+?\K\S+@\S+/', $line, $m);
    var_dump($m);
}

其中:

  • \K意味着忘记我们遇到的所有事情。
  • \S代表任何非空格,与[^\s]
  • 相同

然后我们只有$m[0]

中的电子邮件

<强>输出:

array(1) {
  [0]=>
  string(14) "bugs@gmail.com"
}
array(1) {
  [0]=>
  string(14) "bugs@gmail.com"
}
array(1) {
  [0]=>
  string(20) "bugs.bunny@gmail.com"
}
array(1) {
  [0]=>
  string(20) "bugs.bunny@gmail.com"
}
array(1) {
  [0]=>
  string(14) "bugs@gmail.com"
}

答案 1 :(得分:0)

如果您将正则表达式更改为([^ \ s] + @ [^ \ s] +),则完整结果应该只是电子邮件地址。

答案 2 :(得分:0)

组0 完全匹配。

如果您将正则表达式更改为[^\s]+@[^\s]+,那么它将与您所有示例中的电子邮件地址相匹配。 https://regex101.com/r/SQL9Ul/1

由于名称的长度不同,您不能使用正面的后视,并将电子邮件地址与整个匹配项匹配。