RegEx:找到某些字符串后匹配,否则选择全部

时间:2015-01-16 10:59:42

标签: php regex

我想在& amazon -之后选择所有内容。 如果未找到,则应返回整个字符串

字符串:

'adidas & amazon - cool shirt'

我提出的最好的事情是:

(?(?=.*\bamazon\b)(\bamazon\b \- (.+ *))|(.*))

但它也会回归亚马逊部分。

3 个答案:

答案 0 :(得分:1)

以下正则表达式适合您。

(?<=&\samazon\s-).*|^(?!.*&\samazon\s-).*$

(?<=&\samazon\s-).*匹配&空间亚马逊空间连字符之后的所有字符。

^(?!.*&\samazon\s-).*$匹配没有& amazon -字符串的整行。

如果您只想处理水平空格,请将\s更改为\h

&\s*amazon\s*-\K.*|^(?!.*\samazon\s-).*$

\K会丢弃之前匹配的字符,以便在决赛中打印出来。这完成了可变长度正lookebhind断言的工作。

DEMO

答案 1 :(得分:0)

您可以使用此正则表达式:

^(?|(?:.*?&\s*amazon\s*-\s*)(.*)|(.*))$

RegEx Demo

您匹配的数据将在捕获的组#1中可用。

此处(?|...)是一个非捕获组,确保此括号内的所有捕获的组都以相同的索引开始,即为1.

这个正则表达式使用简单的正则表达式替换。在LHS,我们有:

(?:.*?&\s*amazon\s*-\s*)(.*)

& amazon -之后的字符串放入捕获的组#1

在RHS上我们只有:

(.*)

将整行放入捕获的组#1本身(由于使用(?|...)

答案 2 :(得分:0)

使用您之前稍微调整过的模式应该有效:

(?(?=.*&\s\bamazon\b).+)(.+\-\s(.+))

如果您希望此匹配amazon,无论您在-之前的位置如何,都可以使用:

(?(?=.*\bamazon\b).+)(.+\-\s(.+))

示例:

https://regex101.com/r/kK3hP0/1 //在& amazon

之前匹配-

https://regex101.com/r/nG3yK8/1 //在amazon

之前的任何位置匹配-