正则表达式获取除最后一个词之外的所有内容,直到找到一些文本
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'
详情:
^
- 字符串开头
\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 的输出
请尝试,
我有这种格式的数据:
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'
详情:
^
- 字符串开头\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 的输出
请尝试,