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

标签 c# regex

目标:正则表达式匹配

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

相关文章:

c# - DataGridView 的行为就好像它在 TableLayoutPanel 中具有最小尺寸一样

c# - 无法将参数值从SqlParameter转换为String

regex - Safari 对前瞻和后置 RegExp 的支持

JavaScript 正则表达式仅提取元素中的数字

python - 使用正则表达式清理数据框列值

javascript - 在javascript中使用正则表达式提取最后两个斜杠之间的字符串

c# - 在给定路径创建 XML 文档

c# - 将 Java Socket、BufferedReader、BufferedWriter 转换为 C#?

c# - 按类型属性查询 Cosmos DB

c++ - 是否正则表达式(获取不是所有满足正则表达式的文本)