[英]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}
不是\\|\\|
沒有性能提升它可能更好讀。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.