gpt4 book ai didi

C# 正则表达式匹配不跟随相同字符对的字符

转载 作者:行者123 更新时间:2023-11-30 23:33:43 26 4
gpt4 key购买 nike

目标:正则表达式匹配

对于这个例子,我有兴趣匹配一个“|”管道字符。如果它是单独的,我需要匹配它:“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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com