匹配/提取2个字符串之间的所有字符

时间:2018-12-11 19:05:34

标签: php regex

我想从字符串\n*DRIVGo*\nVolledige naam: John Doe\nTelefoonnummer: 0612345678\nIP: 94.214.168.86\n中提取John Doe

所以我猜想正则表达式模式需要提取'Volledige naam:'和'\ n'之间的所有字符。有谁可以帮助我吗?

3 个答案:

答案 0 :(得分:2)

您可以使用此正则表达式捕获组1中的名称

naam:\s+([a-zA-Z ]+)

由于名称只能包含字母和空格,因此使用[a-zA-Z ]+字符集。

Php示例代码,

$str = "\n*DRIVGo*\nVolledige naam: John Doe\nTelefoonnummer: 0612345678\nIP: 94.214.168.86\n";
preg_match('/naam:\s+([a-zA-Z ]+)/', $str, $matches);
print_r($matches[1]);

打印

John Doe

Online demo

答案 1 :(得分:0)

所需的字符串始终存在于indexOf(':')处,并使用先前获得的indexOf的值作为后续调用中的偏移量在同一调用处结束。 (鉴于第一次调用并不表示未找到结果,也不表明发送调用的结果[这表明字符串中未包含完整的段])

为此使用正则表达式似乎不太有用,因为源字符串不会以某种需要自动机的方式变化。

考虑一个简单的split('\n')操作[可选地提供要获取的匹配长度],如果需要,可以在不需要任何底层引擎的情况下进行进一步的此类调用,以获取所需的值。

提供的逻辑与正则表达式为其底层实现所做的相同,尽管通常仅在某些情况下才证明在内存和性能方面的关联成本是合理的(例如,涉及代码页或语言环境转换,但不适用)限于,另一种情况是找到词尾变形,标点符号等错误的单词],在这种情况下似乎不需要。

考虑一个具有字段和方法的解析器构造,这些字段和方法可以获取[指向]并在需要时验证数据的完整性;在大多数情况下,这还使您可以快速序列化和反序列化结果。

最后,由于您指出了您的语言是PHP,所以我想我也应该告诉您indexOf的含义是strpos,下面的代码将演示无需使用正则表达式即可解决此问题的各种方法

$str = "\n*DRIVGo*\nVolledige naam: John Doe\nTelefoonnummer: 0612345678\nIP: 94.214.168.86\n";
$search = chr(10);
$parts = explode($search, $str);
$partsCount = count($parts);
print_r($parts);
if($partsCount > 1) print($parts[1]); //*DRIVGo*

print('-----Same results via different methodology------');

$groupStart = 0;
$groupEnd = $groupStart; 
$max = strlen($str);

//While the groupEnd has not approached the length of str
while($groupEnd <= $max && 
      ($groupStart = strpos($str, $search, $groupStart)) >= 0 && // find search in str starting at groupStart, assign result to groupStart
      ($groupEnd = strpos($str, $search, $groupEnd + 1)) > $groupStart) // find search in str starting at groupEnd + 1, assign result to groupEnd
{   
    //Show the start, end, length and resulting substring
    print_r([$groupStart, $groupEnd, $groupEnd - $groupStart, substr($str, $groupStart, $groupEnd - $groupStart)]); 
    //advance the parsing
    $groupStart = $groupEnd;
}

答案 2 :(得分:0)

您可以使用

^Volledige naam:\s*\K.+

multiline模式下。那是

^                    # start of line
Volledige naam:\s*\K # Volledige naam:, whitespaces and "forget" what#s been matched
.+                   # rest of the line


PHP中:

<?php
$string = <<<DATA
*DRIVGo*
Volledige naam: John Doe
Telefoonnummer: 0612345678
IP: 94.214.168.86
DATA;

$regex = '~^Volledige naam:\s*\K.+~m';

if (preg_match($regex, $string, $match)) {
    print_r($match);
}
?>

请参见a demo on ideone.comregex101.com上的内容。