Совпадение / извлечение всех символов между 2 строками - PullRequest
0 голосов
/ 11 декабря 2018

Я хочу извлечь Джона Доу из строки \n*DRIVGo*\nVolledige naam: John Doe\nTelefoonnummer: 0612345678\nIP: 94.214.168.86\n

Так что я думаю, что шаблон регулярного выражения должен извлечь все символы между 'Volledige naam:' и '\ n'.Есть ли кто-нибудь, кто может мне помочь?

Ответы [ 3 ]

0 голосов
/ 11 декабря 2018

Вы можете использовать это регулярное выражение для захвата имени в группе 1,

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

Поскольку имя может содержать только алфавиты и пробелы, следовательно, используйте [a-zA-Z ]+ charset.

Php sampleкоды,

$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

Онлайн-демонстрация

0 голосов
/ 11 декабря 2018

Вы можете использовать

^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


In 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);
}
?>

См. демо на ideone.com , а такжена regex101.com .

0 голосов
/ 11 декабря 2018

Требуемая строка постоянно существует в indexOf(':') и заканчивается в том же вызове, используя ранее полученное значение indexOf в качестве смещения в последующем вызове.(Учитывая, что первый вызов не указывает на то, что результат не был найден, а также на то, что результат вызова отправки [который будет означать, что полный сегмент не содержится в строке])

Использование регулярного выражения дляэто кажется менее полезным, потому что исходная строка не будет изменяться каким-либо образом, что требует автоматов.

Рассмотрим простую операцию split('\n') [необязательно с учетом длины совпадений для получения], за которой могут последовать такие вызовы, еслинеобходимо получить желаемое значение без необходимости какого-либо базового движка.

Предоставленная логика будет такой же, как и для вас Regex, с его базовой реализацией, хотя связанные затраты как с точки зрения памяти, так и производительностиобычно оправдано только для определенных сценариев [например, связанных с преобразованием кодовой страницы или локали, но не ограничиваясь этим, другой случай - это поиск слов с неправильным разделением, пунктуацией и т. д.], которые в этом случае не кажутся необходимыми.

Рассмотрим конструкцию синтаксического анализатора с полями и методами, которые могут получить [указать на], а также проверить целостность данных, когда это требуется;Это также позволит вам быстро сериализовать и десериализовать результаты в большинстве случаев.

Наконец, поскольку вы указали, что ваш язык - 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;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...