![](/img/trans.png)
[英]C# need regular expression to capture the second occurence after a underscore
[英]Regex to match words between underscores after second occurence of underscore
所以我想在下划线第二次出现后在下划线之间添加单词
这是我的字符串
ABC_BC_BE08_C1000004_0124
我已经组装了这个表达式
(?<=_)[^_]+
很好,它符合我的需要,但只跳过第一个词,因为它前面没有下划线。 我希望它跳过 ABC 和 BC,只获取最后三个字符串,我试过乱搞,但我被卡住了,无法让它工作。 谢谢!
您可以在此处使用Split
和Skip
的非正则表达式方法:
var text = "ABC_BC_BE08_C1000004_0124";
var result = text.Split('_').Skip(2);
foreach (var s in result)
Console.WriteLine(s);
Output:
BE08
C1000004
0124
请参阅C# 演示。
使用正则表达式,您可以使用
var result = Regex.Matches(text, @"(?<=^(?:[^_]*_){2,})[^_]+").Cast<Match>().Select(x => x.Value);
(?<=^(?:[^_]*_){2,})
- 正向后视匹配与当前位置左侧紧邻的以下模式匹配的位置:
^
- 字符串的开始(?:[^_]*_){2,}
- 两个或多个 ( {2,}
) 序列,除了_
( [^_]*
) 之外的任何零个或多个字符,然后是一个_
字符[^_]+
- _
以外的一个或多个字符Usign .NET 还有一个捕获集合,您可以将其与正则表达式和重复的 catpure 组一起使用。
^[^_]*_[^_]*(?:_([^_]+))+
模式匹配:
^
字符串开始[^_]*_[^_]*
匹配除_
之外的任何字符,匹配_
并再次匹配除_
之外的任何字符(?:
非捕获组
_([^_]+)
匹配_
并捕获第 1组中除_
以外的任何字符 1 次或多次)+
关闭非捕获组,重复1次或多次例如:
var pattern = @"^[^_]*_[^_]*(?:_([^_]+))+";
var str = "ABC_BC_BE08_C1000004_0124";
var strings = Regex.Match(str, pattern).Groups[1].Captures.Select(c => c.Value);
foreach (String s in strings)
{
Console.WriteLine(s);
}
Output
BE08
C1000004
0124
如果只想匹配下划线之间的单词字符,模式的另一个选项可能是使用否定字符 class [^\W_]
从单词字符中排除下划线:
^[^\W_]*_[^\W_]*(?:_([^\W_]+))+
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.