正则表达式提取以& [?开头的最后一个元素

时间:2014-09-18 14:54:59

标签: regex

正则表达式应该应用于以下字符串:

[Product].[Product Catalog].[Product].&[50]&[53]&[DE]&[1ST_HQ]&[50_54_36]

的As-Is:
应用以下正则表达式:

(?:&\[).+(?:\])

返回:

&[50]&[53]&[DE]&[1ST_HQ]&[50_54_36]

待:
我想更改该正则表达式以返回

&[50_54_36]

只。 有什么想法吗?

4 个答案:

答案 0 :(得分:4)

如果要提取最后一个元素,可以简单地使用字符串$锚点的结尾。不需要为这些字符实现非捕获组,因此您也可以删除组。

&\[[^]]+]$

<强>解释

&        # '&'
\[       # '['
 [^]]+   #    any character except: ']' (1 or more times)
]        # ']'
$        # before an optional \n, and the end of the string

Live Demo

或者,我建议使用捕获组来匹配并捕获匹配结果。这里的.*会占用所有字符,直到最后一次出现&[。然后,您可以参考群组#1进行匹配。

.*(&\[[^]]+])

答案 1 :(得分:2)

使用此正则表达式:

.*\K&\[.+\]

.*指示正则表达式引擎匹配所有,然后回溯匹配,所以我们的匹配将从字符串的末尾向后开始并匹配最后一个。 \K之后保持匹配。

查看regex demo

答案 2 :(得分:1)

如果您正在使用PCRE(或Ruby),则可以执行点匹配全部,然后回溯到&[...]的最后一个匹配项。使用\K

将内容丢弃到左侧
.*\K(?:&\[).+(?:\])

Demo


对于不支持\K的引擎,您可以使用重复的捕获组。这需要您使用.+?变为懒惰重复。捕获组将包含捕获的最后一个实例的内容。这将匹配&[50]&[53]&[DE]&[1ST_HQ]&[50_54_36],但捕获组1将等于&[50_54_36]

((?:&\[).+?(?:\]))+

Demo

答案 3 :(得分:1)

只需使用预测并将.+替换为[^\[\]]+

&\[[^\[\]]+\](?=$)

DEMO