正则表达式,不同的结束字符串

时间:2013-10-31 16:45:04

标签: php regex

我试图匹配E)“列”的所有内容。

A1147/13 NOTAMN
Q) ESAA/QRRCH/IV/BO /AW/000/023/5933N01746E002
A) ESSA B) 1311140900 C) 1311211500
D) 14 21 0900-1500
E) UPPER LIMIT ES R16C KUNGSANGEN RAISED TO 2300 FT AMSL
REF AIP ENR 5.1
F) GND G) 2300FT AMSL
CREATED: 30 Oct 2013 10:00:00 
SOURCE: EUECYIYN

使用以下正则表达式:

preg_match_all('/E\)(.*)(?=F\))/is', $string, $output);

我已经设法获取数据,但只有F)列存在,它并不总是这样做。有时结束就像:

A1147/13 NOTAMN
Q) ESAA/QRRCH/IV/BO /AW/000/023/5933N01746E002
A) ESSA B) 1311140900 C) 1311211500
D) 14 21 0900-1500
E) UPPER LIMIT ES R16C KUNGSANGEN RAISED TO 2300 FT AMSL
REF AIP ENR 5.1
CREATED: 30 Oct 2013 10:00:00 
SOURCE: EUECYIYN

如何解决这个问题?


编辑: 这是我想要回归的部分:

UPPER LIMIT ES R16C KUNGSANGEN RAISED TO 2300 FT AMSL
REF AIP ENR 5.1

它将以列F)的开头或文本CREATED结束。

2 个答案:

答案 0 :(得分:2)

我建议使用HamZa的方法,稍微进行一些调整:

E\)(.*?)(?=F\)|$)

regex101 demo

您也可以尝试这样的事情,但处理时间可能会长一些:

E\)((?:(?!F\)).)+)

regex101 demo

(?:(?!F\)).)+将匹配除F)

之外的任何内容

如果要匹配到CREATED:,可以轻松地将其添加到正则表达式中:

E\)((?:(?!F\)|CREATED:).)+)

答案 1 :(得分:1)

请勿使用DOTALL并使用MULTILINE:

/^E\).*$/im