目标:正则表达式匹配
对于这个例子,我有兴趣匹配一个“|”管道字符。 如果它是单独的,我需要匹配它:“aaa|aaa” 只有在它前面有一对管道时,我才需要匹配它(最后一个管道):(2,4,6,8 ...任何偶数)
另一种方式:我想忽略所有管道对“||” (右到左) 或者我只想选择单例汉酒吧(奇怪的人)
string twomatches = "aaaaaaaaa||||**|**aaaaaa||**|**aaaaaa";
string onematch = "aaaaaaaaa||**|**aaaaaaa||aaaaaaaa";
string noMatch = "||";
string noMatch = "||||";
我正在尝试选择最后一个“|”仅当前面有偶数序列的“|”时对或在一个字符串中当一个单独的条存在时。 不管“|”的个数
最佳答案
您可以使用以下正则表达式来选择奇数一个管道输出:
(?<=(?<!\|)(?:\|{2})*)\|(?!\|)
参见 regex demo .
正则表达式分解:
-
(?<=(?<!\|)(?:\|{2})*)
- 如果一个管道前面有偶数个管道((?:\|{2})*
- 0 个或更多恰好 2 个管道的序列)从没有前面的管道((?<!\|)
)的位置 -
\|
- 匹配右边的奇数管道 -
(?!\|)
- 如果它后面没有另一个管道。
请注意,此正则表达式使用可变宽度后视并且非常耗费资源。我宁愿在这里使用捕获组机制,但这完全取决于匹配那个奇怪管道的实际目的。
这里是正则表达式的修改版本,用于删除奇数:
var s = "1|2||3|||4||||5|||||6||||||7|||||||";
var data = Regex.Replace(s, @"(?<!\|)(?<even_pipes>(?:\|{2})*)\|(?!\|)", "${even_pipes}");
Console.WriteLine(data);
参见 IDEONE demo .在这里,量化部分从 lookbehind 移动到名为捕获组的even_pipes,以便它可以通过替换字符串中的反向引用来恢复。 Regexhero.net 显示具有捕获组的版本每秒迭代 129,046 次,而具有可变宽度后视的原始版本每秒迭代 69,206 次。
仅在绝对必要时才使用可变宽度后视!
关于C# 正则表达式匹配不跟随相同字符对的字符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33811716/