如果字符串包含单词A或单词B,则Regex将其拆分


Regex to split string if it containt wordA or wordB

再次编辑以使其更加清晰。

Wichphp正则表达式模式将为我提供一个始终包含2个值的匹配数组,该数组是由"wordA"或"wordB"分隔的字符串的2部分。如果字符串不包含这些单词,只需将字符串作为第一个数组返回,在第二个数组中返回null即可。

示例:

preg_match("pattern","foo wordA bar",$match), $match will contain array['foo', 'bar']
preg_match("pattern","foo wordB bar",$match), $match will contain array['foo', 'bar']
preg_match("pattern","foo bar test",$match), $match will contain array['foo bar test', null]

我知道$match第一个值总是字符串,所以我不写它。

老问题:

我需要把一行地址分成几个部分。我找不到捕捉街道部分的方法,但不包括APP或APT单词(如果存在),如果存在,则捕捉后面的单词。

例如:

"5847A,rue-Principal APP A"应匹配:(5847,A,rue Principal,A)

"5847A,rue Prince Arthur APT 22"应匹配:(5847,A,rue王子Arthur,22)

"1111,舍伍德街"应匹配:(1111,Sherwood street,)

我在用PHP。

到目前为止,我所拥有的是:/^('d+)(.*), (.*)(?:APP|APT)(?:'s*(.*))?$/i wich-wook与示例1和2。如果我试图通过添加?之后,第三个匹配包括单词APP或APT…

知道如何从匹配中排除可选和备选APP或APT单词吗?

谢谢

编辑:

我可以简化这个问题:如何重新生成字符串,以便匹配返回相同的字符串减去单词APP或APT(如果他出现在字符串中间)。

正如@MadaraUchiha所指出的,在地址上运行正则表达式是个坏主意,因为它们可以是任何格式。

如果你知道你有一致的地址,那么我想你可以使用regex:

^([0-9]+)([A-Z])?,'s(?:(.*?)'s(?:APP|APT)'s(.*)|(.*))$

以及替代品:

$1,$2,$3$5,$4

以下是它的表现。

它与您的非常相似(我更改了一些内容),并添加了或(|)运算符来寻址没有APPAPT的第二类地址。

如果你想要一致的匹配次数,也许是这样?

^([0-9]*)([A-Z]?),((?:(?!'sAPP|'sAPT).)*)(?:'sAPP|'sAPT)?(.*)$

Regex101示例。

对于"简易"版本

 var_dump(preg_replace ( "/ apt|app /i" , "" ,"5847A, rue Prince Arthur APT 22"  ));

覆盖

输出

5847A, rue Prince Arthur 22

越难的版本,你就需要更多的上下文,比如为什么逗号看起来像这样。

硬版

([0-9]*)([a-z]?),(((?!app|apt).)*)(?:app|apt)?(.*)

似乎适用于您的测试用例

我认为这应该有效:

$pattern = "/'bAPP|APT'b/i";
$subject = "1111, Sherwood street";
echo preg_replace($pattern, "", $subject);