我试图根据位于两个字符(_)之间的文本字符串来获取某些数据,但可能是第n个位置的单词。
目前我有以下
!((?:.*?(_)){2})_(.+?)$
处理以下数据
D20_Mbps_U10_Mbps_TC4_P
我希望得到的地方
U10
但是第一部分捕获
时什么都没有D20_Mbps_
因此没有留下第二部分捕捉
我已经尝试了
_\s*(.*?)(?=\s*_)
但这只是让我第一次出现在我需要它成为第n位置的地方。我可以在运行时提供n。
任何想法?
由于
答案 0 :(得分:0)
让我试着详细回答这个问题。
如果要在分隔字符串中匹配某个子字符串的第N个匹配项,您应该考虑一些String.Split
函数。在您的情况下,使用_
拆分并获取所需的值是一项微不足道的任务。
现在,当您无法使用编程方法提取该值时,您只能使用限制量词,分组和捕获(在Java和.NET中,可以实现即使没有捕获也一样。)
因此,主要思想是匹配分隔符以外的0个或更多字符,然后匹配分隔符本身,然后重复相同的 N-1次。然后,再次匹配分隔符并捕获以下非分隔符。
^(?:[^_]*_){2}([^_]*)
见demo。第1组将包含U10
。
^(?:[^_]*_){2}([^_]*)_(.+)$
这会将第3个_
- 分隔元素捕获到第1组中。在这种情况下,第2组是第4个+元素,其余部分直到结尾。
请注意,在某些正则表达式中,必须转义{
和(
(vim,使用非EGREP版本等)。