正则表达式获取除最后一个词之外的所有内容,直到找到一些文本

regex get everything except last word and until find some text

我有这种格式的数据:

  1  DOPPEL TYP I MEERBLICK           HALBPENSION
 FRÜHBUCHER 20%
 INKL. REISELEITUNG UND TRANSFER AB/BIS
 FLUGHAFEN
 KEIN INFO-TREFFEN IM HOTEL! REISELEITUNG  IST TELEFONISCH ZU ERREICHEN UND AUF  ANFRAGE
 F367655  HERR WILKAT, CHRISTINE                           O 05.01.15
 F367655  HERR LEBEDIES, HANS-JOACHIM                      O 05.01.15

我想捕获:1 和 DOPPEL TYP I MEERBLICK 以及 "FFRUHBUCHER.." 和 "ANFRAGE" 之间的所有文本(所以 F367655 是结束分隔符)作为不同的匹配项。 但是我有这个捕获的正则表达式: 1 和 HALBPENSION:

$re = "/\s(\d{1})(\w+\W{1,2})*/"; 
$str = " 1  DOPPEL TYP I MEERBLICK           HALBPENSION\n FRÜHBUCHER 20%\n INKL. REISELEITUNG UND TRANSFER AB/BIS\n FLUGHAFEN\n KEIN INFO-TREFFEN IM HOTEL! REISELEITUNG  IST TELEFONISCH ZU ERREICHEN UND AUF  ANFRAGE\n F367655  HERR WILKAT, CHRISTINE                           O 05.01.15\n F367655  HERR LEBEDIES, HANS-JOACHIM                      O 05.01.15"; 

preg_match_all($re, $str, $matches);

我在这里测试:Regex101

因此,我不想捕获最后一个词 ("HALPENSION"),而是想捕获除最后一个词之外的所有内容。还有 HALBPENSION(也许是其他词)之后和 F367655(“FRÜHBUCHER 20% INKL。 REISELEITUNG UND 转移 AB/BIS 机场 KEIN INFO-TREFFEN IM HOTEL! REISELEITUNG IST TELEFONISCH ZU ERREICHEN UND AUF ANFRAGE").

我已经尝试了几种解决方案,但都无法正常工作。

在此先感谢您的帮助!

你可以选择:

<?php

$string = ' 1  DOPPEL TYP I MEERBLICK           HALBPENSION';
$regex = '~^\D*(\d+)\h*((?:(?!\h{2,}).)+)~';
preg_match_all($regex, $string, $matches);
print_r($matches);

?>

$matches[1] 将容纳数字,$matches[2] DOPPELTYP I MEERBLICK,请参见 a demo on ideone.com as well as on regex101.com

您可以使用以下模式 捕获 具有 preg_match 的第一个和第二个值:

 '~^\s*(\d+)\s*(.*\S) .*\R((?s:.*?))\R\h*F\d{6}~um'

regex demo

详情:

  • ^ - 字符串开头
  • \s* - 0+ 个前导空格
  • (\d+) - 第 1 组捕获 1+ 个数字
  • \s* - 0+ 个空格
  • (.*\S) - 第 2 组捕获 0+ 个字符,但尽可能多地捕获一个换行符,直到最后一个非空白字符(包括)和
  • \h - 1 个水平空格(不在组 2 内)
  • .* - 该行的其余部分
  • \R - 一个换行符
  • ((?s:.*?)) - 第 3 组捕获 0+ 个尽可能少的字符,直到第一个
  • \R\h*F\d{6} - 换行符、0+ 水平空格、F 和 6 位数字。

PHP demo:

$str = " 1  DOPPEL TYP I MEERBLICK           HALBPENSION\n FRÜHBUCHER 20%\n INKL. REISELEITUNG UND TRANSFER AB/BIS\n FLUGHAFEN\n KEIN INFO-TREFFEN IM HOTEL! REISELEITUNG  IST TELEFONISCH ZU ERREICHEN UND AUF  ANFRAGE\n F367655  HERR WILKAT, CHRISTINE                           O 05.01.15\n F367655  HERR LEBEDIES, HANS-JOACHIM                      O 05.01.15"; 
preg_match('~^\s*(\d+)\s*(.*\S) .*\R((?s:.*?))\R\h*F\d{6}~um', $str, $m);
array_shift($m);
print_r($m);
    $str = ' 1  DOPPEL TYP I MEERBLICK           HALBPENSION';
$str = preg_replace('/\s\s+/', ' ', $str);
$array=explode(' ',$str);
$count=count($array);
$text='';
for($i=0;$i<$count-1;$i++){
    if($text!='')$text.=' ';
$text.=$array[$i];  

}
echo $text;

$text 给出类似 1 DOPPEL TYP I MEERBLICK 的输出 请尝试,