RegEx字符串介于N和第(N + 1)个Occurance之间

时间:2017-06-09 11:06:26

标签: c# regex

我试图在两个特殊字符之间找到第n个子字符串。例如。 一个| 2 | 3 | 4 | 5

说,我希望找到(第n和第n + 1)第2和第3次出现之间的字符串' |'结果是“三个”。我想用RegEx来做。有人可以指导我吗?

我目前的尝试如下。

tidyverse

3 个答案:

答案 0 :(得分:1)

使用此: (?:.*?\|){n}(.[^|]*)

其中n是您需要跳过特殊字符的次数。第一个捕获组将包含结果。

Demo for n = 2

答案 1 :(得分:1)

如果您可以完全访问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正则表达式驱动的工具):

^(?:[^|]*\|){2}([^|]*)

请参阅regex demo。匹配

  • ^ - 字符串开头
  • (?:[^|]*\|){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

请参阅C# demo

如果某个工具不允许您访问捕获的组,请将初始部分转换为非消费的lookbehind模式:

(?<=^(?:[^|]*\|){2})[^|]*
^^^^^^^^^^^^^^^^^^^^

this regex demo(?<=...)正向后观察仅检查当前位置左侧的模式存在,如果模式不匹配,则匹配将失败。

答案 2 :(得分:0)

使用此正则表达式,然后从2集合中选择第n个匹配项(在本例中为Matches):

string subtext = "zero|one|two|three|four";
Regex r = new Regex("(?<=\|)[^\|]*");
var m = r.Matches(subtext)[2];