我有以下输入文字:
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
被忽略,因为之前没有任何内容(我正在测试除反斜杠之外的任何内容)
- 每个字母都与之前的空格相匹配
- JKL
与J
匹配,之前有空格,KL
为一个字符串。
我尝试了不同的其他变体与parantheses,但没有成功。
答案 0 :(得分:2)
否定字符类[^\\]
是与文本匹配的消费模式,将其添加到匹配值并将正则表达式索引推进到匹配结束。
使用非消费negative lookbehind:
(?<!\\)[A-Z]
^^^^^^^
请参阅regex demo。作为非消费模式,(?<!\\)
仅检查在ASCII大写字母之前是否存在反斜杠,如果有,则引擎会使匹配失败。如果有\
,则匹配该字母(而匹配值中的反斜杠仍然缺失)。
C#代码:
var results = Regex.Matches(s, @"(?<!\\)[A-Z]")
.Cast<Match>()
.Select(m => m.Value)
.ToList();