使用RegEx获取未加前缀/未转义的文本

时间:2017-07-26 06:40:50

标签: c# .net regex

我有以下输入文字:

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被忽略,因为之前没有任何内容(我正在测试除反斜杠之外的任何内容) - 每个字母都与之前的空格相匹配 - JKLJ匹配,之前有空格,KL为一个字符串。

我尝试了不同的其他变体与parantheses,但没有成功。

1 个答案:

答案 0 :(得分:2)

否定字符类[^\\]是与文本匹配的消费模式,将其添加到匹配值并将正则表达式索引推进到匹配结束。

使用非消费negative lookbehind

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

请参阅regex demo。作为非消费模式,(?<!\\)仅检查在ASCII大写字母之前是否存在反斜杠,如果有,则引擎会使匹配失败。如果有\,则匹配该字母(而匹配值中的反斜杠仍然缺失)。

C#代码:

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