正则表达式获取除了最后一个单词之外的所有内容,

时间:2016-09-15 09:29:12

标签: php regex expression preg-match word

我有这种格式的数据:

  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ÜHBUCHER20%”)  INKL。 REISELEITUNG UND TRANSFER AB / BIS  FLUGHAFEN  KEIN INFO-TREFFEN IM HOTEL! REISELEITUNG IST TELEFONISCH ZU ERREICHEN UND AUF ANFRAGE“)。

我尝试了几种解决方案,但我没有让它发挥作用。

提前感谢您的帮助!

3 个答案:

答案 0 :(得分:1)

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

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

请参阅regex demo

<强>详情:

  • ^ - 字符串开头
  • \s* - 0+领先的空白
  • (\d+) - 第1组捕获1+位数
  • \s* - 0+ whitespaces
  • (.*\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);

答案 1 :(得分:0)

你可以去:

<?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 MEERBLICKa demo on ideone.com以及on regex101.com

答案 2 :(得分:0)

    $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 请试试,