我试图在两个特殊字符之间找到第n个子字符串。例如。 一个| 2 | 3 | 4 | 5
说,我希望找到(第n和第n + 1)第2和第3次出现之间的字符串' |'结果是“三个”。我想用RegEx来做。有人可以指导我吗?
我目前的尝试如下。
tidyverse
答案 0 :(得分:1)
答案 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];