两个第n个位置字符之间的正则表达式

时间:2015-09-24 07:28:36

标签: regex

我试图根据位于两个字符(_)之间的文本字符串来获取某些数据,但可能是第n个位置的单词。

目前我有以下

!((?:.*?(_)){2})_(.+?)$

处理以下数据

D20_Mbps_U10_Mbps_TC4_P

我希望得到的地方

U10

但是第一部分捕获

时什么都没有
D20_Mbps_

因此没有留下第二部分捕捉

我已经尝试了

_\s*(.*?)(?=\s*_)

但这只是让我第一次出现在我需要它成为第n位置的地方。我可以在运行时提供n。

任何想法?

由于

1 个答案:

答案 0 :(得分:0)

让我试着详细回答这个问题。

如果要在分隔字符串中匹配某个子字符串的第N个匹配项,您应该考虑一些String.Split函数。在您的情况下,使用_拆分并获取所需的值是一项微不足道的任务。

现在,当您无法使用编程方法提取该值时,您只能使用限制量词,分组和捕获(在Java和.NET中,可以实现即使没有捕获也一样。)

因此,主要思想是匹配分隔符以外的0个或更多字符,然后匹配分隔符本身,然后重复相同的 N-1次。然后,再次匹配分隔符并捕获以下非分隔符。

^(?:[^_]*_){2}([^_]*)

demo。第1组将包含U10

another variation

^(?:[^_]*_){2}([^_]*)_(.+)$

这会将第3个_ - 分隔元素捕获到第1组中。在这种情况下,第2组是第4个+元素,其余部分直到结尾。

请注意,在某些正则表达式中,必须转义{((vim,使用非EGREP版本等)。