我试图找到两个特殊字符之间第 n 次出现的子字符串。例如。
一|二|三|四|五
比如说,我正在寻找(第 n 次和第 n+1 次)第二次和第三次出现“|”之间的字符串字符,结果是“三”。我想使用正则表达式来做到这一点。有人可以指导我吗?
我当前的尝试如下。
string subtext = "zero|one|two|three|four";
Regex r = new Regex(@"(?:([^|]*)|){3}");
var m = r.Match(subtext).Value;
如果您拥有对 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}([^|]*)
See the 。它匹配
-
^
- 字符串的开头
-
(?:[^|]*\|){2}
- 2 (or adjust it as you need) or more sequences of:
-
[^|]*
- 零个或多个字符以外的字符|
-
\|
- a |
symbol
-
([^|]*)
- 第 1 组(通过.Groups[1]
):零个或多个字符,除了|
要测试的 C# 代码:
var pat = $@"^(?:[^|]*\|){{{idx}}}([^|]*)";
var m = Regex.Match(subtext, pat);
if (m.Success) {
Console.WriteLine(m.Groups[1].Value);
}
// => two
See the C# demo http://ideone.com/UinegV
如果某个工具不允许您访问被捕获的群体,将初始部分转变为非消耗的lookbehind模式:
(?<=^(?:[^|]*\|){2})[^|]*
^^^^^^^^^^^^^^^^^^^^
See . The (?<=...)
正向后查找仅检查当前位置左侧是否存在模式,如果模式不匹配,则匹配将失败。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)