C# 介于N和(N+1)次出现之间的正则表达式字符串
我试图在两个特殊字符之间找到第n个出现的子字符串。例如 一|二|三|四|五 比如说,我想找到介于n和n+1之间的字符串,第2次和第3次出现的“|”字符,结果是“3”。我想用正则表达式来实现。有人能指引我吗 我目前的尝试如下C# 介于N和(N+1)次出现之间的正则表达式字符串,c#,regex,C#,Regex,我试图在两个特殊字符之间找到第n个出现的子字符串。例如 一|二|三|四|五 比如说,我想找到介于n和n+1之间的字符串,第2次和第3次出现的“|”字符,结果是“3”。我想用正则表达式来实现。有人能指引我吗 我目前的尝试如下 string subtext = "zero|one|two|three|four"; Regex r = new Regex(@"(?:([^|]*)|){3}"); var m = r.Match(subtext).Valu
string subtext = "zero|one|two|three|four";
Regex r = new Regex(@"(?:([^|]*)|){3}");
var m = r.Match(subtext).Value;
使用此正则表达式,然后从Matches集合中选择本例2中的第n个匹配项:
string subtext = "zero|one|two|three|four";
Regex r = new Regex("(?<=\|)[^\|]*");
var m = r.Matches(subtext)[2];
使用此正则表达式,然后从Matches集合中选择本例2中的第n个匹配项:
string subtext = "zero|one|two|three|four";
Regex r = new Regex("(?<=\|)[^\|]*");
var m = r.Matches(subtext)[2];
使用以下命令:
?:。。\\{n}.[^ |]*
其中n是需要跳过特殊字符的次数。第一个捕获组将包含结果
使用以下命令:
?:。。\\{n}.[^ |]*
其中n是需要跳过特殊字符的次数。第一个捕获组将包含结果
如果你对C代码有完全的访问权,你应该考虑一个简单的分割方法:
var idx = 2; // Might be user-defined
var subtext = "zero|one|two|three|four";
var result = subtext.Split('|').ElementAtOrDefault(idx);
Console.WriteLine(result);
// => two
如果您使用某个由.NET regex支持的工具,而您无法访问代码,则可以使用regex:
^(?:[^|]*\|){2}([^|]*)
看。相配
^-字符串的开头
?:[^ |]*\|{2}-2,或根据需要调整它,或调整以下序列:
[^ |]*-零个或多个字符,而不是|
\|-一个|符号
[^ |]*-组1通过.Groups[1]访问:零个或多个字符,而不是|
C要测试的代码:
var pat = $@"^(?:[^|]*\|){{{idx}}}([^|]*)";
var m = Regex.Match(subtext, pat);
if (m.Success) {
Console.WriteLine(m.Groups[1].Value);
}
// => two
见
如果工具不允许您访问捕获的组,请将初始零件转换为非消耗性查找模式:
(?<=^(?:[^|]*\|){2})[^|]*
^^^^^^^^^^^^^^^^^^^^
看。如果你完全可以访问C代码,你应该考虑一种简单的分割方法:
var idx = 2; // Might be user-defined
var subtext = "zero|one|two|three|four";
var result = subtext.Split('|').ElementAtOrDefault(idx);
Console.WriteLine(result);
// => two
如果您使用某个由.NET regex支持的工具,而您无法访问代码,则可以使用regex:
^(?:[^|]*\|){2}([^|]*)
看。相配
^-字符串的开头
?:[^ |]*\|{2}-2,或根据需要调整它,或调整以下序列:
[^ |]*-零个或多个字符,而不是|
\|-一个|符号
[^ |]*-组1通过.Groups[1]访问:零个或多个字符,而不是|
C要测试的代码:
var pat = $@"^(?:[^|]*\|){{{idx}}}([^|]*)";
var m = Regex.Match(subtext, pat);
if (m.Success) {
Console.WriteLine(m.Groups[1].Value);
}
// => two
见
如果工具不允许您访问捕获的组,请将初始零件转换为非消耗性查找模式:
(?<=^(?:[^|]*\|){2})[^|]*
^^^^^^^^^^^^^^^^^^^^
看。为什么是正则表达式而不是s.Split'|'。ElementAtOrDefault2?你能不能。Split&使用索引?嗨,我想在正则表达式中这样做,这就是为什么我选择避免Split。以下是我目前的尝试。var ggg=Regex.MatchParsed[0],@?:[^ |]*.{4}.Groups;字符串潜文本=零|一|二|三|四;正则表达式r=newregex@?:[^ |]*{3};var m=r.Matchsubtext.Value;我在原始帖子中添加了代码。请注意,接受的答案可能会跳过第n个匹配到第n+1,以防出现后续的|。请参阅我的答案以获得修复。为什么使用正则表达式而不是s.Split'|'。ElementAtOrDefault2?您不能。Split&使用索引?您好,我想在正则表达式中执行此操作,这就是我选择避免Split的原因。以下是我目前的尝试。var ggg=Regex.MatchParsed[0],@?:[^ |]*.{4}.Groups;字符串潜文本=零|一|二|三|四;正则表达式r=newregex@?:[^ |]*{3};var m=r.Matchsubtext.Value;我在原始帖子中添加了代码。请注意,接受的答案可能会跳过第n个匹配到第n+1,以防出现后续的|。看看我的答案。嗨,实际上这会迫使我使用索引。我想去掉它,而是在正则表达式中使用索引。这就是我没有使用SplitHi的原因之一,实际上这会迫使我使用index。我想去掉它,而是在正则表达式中使用索引。这就是我不使用Split的原因之一