簡體   English   中英

C# 正則表達式匹配不遵循相同字符對的字符

[英]C# Regular expression to match on a character not following pairs of the same charcater

目標:正則表達式匹配

對於這個例子,我有興趣匹配一個“|” 管字符。 如果它是單獨的,我需要匹配它:“aaa|aaa”我需要匹配它(最后一個管道)只有在它前面有一對管道時:(2,4,6,8...任何偶數)

另一種方式:我想忽略所有管道對“||” (從右到左)或者我只想選擇單身漢酒吧(奇怪的人出去)

string twomatches = "aaaaaaaaa||||**|**aaaaaa||**|**aaaaaa";
string onematch = "aaaaaaaaa||**|**aaaaaaa||aaaaaaaa";

string noMatch = "||";
string noMatch = "||||";

我正在嘗試選擇最后一個“|” 僅當前面有偶數序列“|”時當單個條形單獨存在時,成對或在字符串中。 不管“|”有多少

您可以使用以下正則表達式來選擇僅奇數個管道輸出:

(?<=(?<!\|)(?:\|{2})*)\|(?!\|)

請參閱正則表達式演示

正則表達式細分:

  • (?<=(?<!\\|)(?:\\|{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 演示 在這里,量化的部分從后視移動到一個名為捕獲組的even_pipes ,以便可以使用替換字符串中的反向引用來恢復它。 Regexhero.net 顯示,帶有捕獲組的版本每秒迭代 129,046 次,帶有可變寬度后視的原始版本每秒迭代 69,206 次。

僅在絕對必要時才使用可變寬度后視!

哦,它重新開放了! 如果您需要更好的性能,也可以試試這個負面的改進版本。

\|(?!\|)(?<!(?:[^|]|^)(?:\|\|)*)

這里的想法是首先匹配最后一個文字| 在序列或單個的右側| 並在比賽結束后立即執行一個否定版本的后視。 這應該表現得更好。

  • \\|(?!\\|)匹配文字| IF NOT后跟另一個管道字符(最右邊的 if 序列)。
  • (?<!(?:[^|]|^)(?:\\|\\|)*) IF 位置緊跟在匹配的| 前面沒有(?:\\|\\|)*任何數量的文字|| 直到一個| ^開始。
    換句話說:如果此位置之前沒有偶數數量的管道字符。

順便說一句,使用\\|{2}不是\\|\\|沒有性能提升它可能更好讀。

在 regexstorm 查看演示

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM