我有以下格式的文字:
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
答案 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 --'
<强> P.S。强>
虽然没有明确说明,但您可能需要将Office
单独列在一条线上。在这种情况下,它应该被^
(行首)和$
(行尾)包围,并且应该使用/m
修饰符:
preg_match('/Address Line 1 ([A-Za-z0-9 ]{1,30})(?=.*^Office$)/sm', $input, $matches);