Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 介于N和(N+1)次出现之间的正则表达式字符串_C#_Regex - Fatal编程技术网

C# 介于N和(N+1)次出现之间的正则表达式字符串

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

我试图在两个特殊字符之间找到第n个出现的子字符串。例如 一|二|三|四|五

比如说,我想找到介于n和n+1之间的字符串,第2次和第3次出现的“|”字符,结果是“3”。我想用正则表达式来实现。有人能指引我吗

我目前的尝试如下

        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的原因之一