正则表达式仅匹配当前后面的字符串中的术语

时间:2017-04-25 10:11:58

标签: php regex

我有以下格式的文字:

Name Andy Andyson
Address Line 1 43 Main Street
Address Line 2 Bigtown
Case Ref 23652/54362
Office
Address Line 1 1 Main Street
Address Line 2 Bigtown
App Date 12/01/2008

我正在尝试提取第一个地址行1.我在PHP中使用正则表达式:

/Address Line 1 ([A-Za-z0-9 ]{1,25})/
除非第一个地址不存在(或者例如行文本为Address Une 1),否则

效果很好,在这种情况下它可能会返回第二个地址行1。

如果后续Address Line 1后面的Office,我如何强制正则表达式仅返回Address Line 1 ([A-Za-z0-9 ]{1,30})(?=.*Office) Address Line 1 ([A-Za-z0-9 ]{1,30})(?=.*\n\rOffice) Address Line 1 ([A-Za-z0-9 ]{1,30})(?!.*\n\rOffice) Address Line 1 ([A-Za-z0-9 ]{1,30}).*Office

我尝试过使用前瞻:

Address 1

我认为前瞻是如何确认字符串中存在的后续值,但上述工作都没有。

如果在单词Office之前找不到第一个Address 1的匹配项,那么我只希望它不返回任何内容,而不是第二个1 Main Street val。

以下内容应生成匹配,而目前返回Name Andy Andyson Address Une 1 43 Main Street Address Line 2 Bigtown Case Ref 23652/54362 Office Address Line 1 1 Main Street Address Line 2 Bigtown App Date 12/01/2008

PopupWindowAction

1 个答案:

答案 0 :(得分:1)

您的第一次尝试(Address Line 1 ([A-Za-z0-9 ]{1,30})(?=.*Office))没问题,但您需要使用单线修改器使.匹配换行符。例如,您可以将其设置为内联(请注意(?s)):

(?s)Address Line 1 ([A-Za-z0-9 ]{1,30})(?=.*Office)

演示:https://regex101.com/r/R0YZRV/1

或者将它放在结束正则表达式括号之后:

preg_match('/Address Line 1 ([A-Za-z0-9 ]{1,30})(?=.*Office)/s', $input, $matches);
                                                             ^
                                               Notice this --'

演示:https://ideone.com/Bv3tvL

<强> P.S。

虽然没有明确说明,但您可能需要将Office单独列在一条线上。在这种情况下,它应该被^(行首)和$(行尾)包围,并且应该使用/m修饰符:

preg_match('/Address Line 1 ([A-Za-z0-9 ]{1,30})(?=.*^Office$)/sm', $input, $matches);

演示:https://ideone.com/1pNGNY