2017-07-26 50 views
2

我有以下輸入文本:獲取的未加前綴/非轉義的文本與正則表達式

A B C D E \F G H I JKL \M 

,我想單獨馬赫的所有字符沒有\作爲prexix,每個字符。所以基本上,作爲比賽,我想得到A,B,C,D,E,G,H,I,J,K和L,F和M不能通過,因爲它們是前綴/轉義。

我得到儘可能

([^\\]([A-Z]{1})) 

其作品,但預期不完全: - A被忽略,因爲沒有了(我任何東西,但反斜線測試) 前 - 每個字母與 -​​之前的空格匹配爲J,之前爲空格,KL爲一個字符串。

我已經嘗試了不同的其他變種與parantheses但沒有成功與此。

回答

2

否定字符類[^\\]消耗模式匹配文本,將其添加到匹配值並提前正則表達式索引到匹配結束。

使用非消耗negative lookbehind

(?<!\\)[A-Z] 
^^^^^^^ 

regex demo。作爲非消費模式,(?<!\\)僅檢查在ASCII大寫字母之前是否存在反斜槓,並且如果存在,則引擎不匹配。如果有\,則該字母匹配(而反斜槓在匹配值中保持不變)。

C#代碼:

var results = Regex.Matches(s, @"(?<!\\)[A-Z]") 
     .Cast<Match>() 
     .Select(m => m.Value) 
     .ToList();