正则表达式“(?<! - ^)(?= [A-Z])” - >

时间:2012-06-03 10:26:58

标签: c# regex

我花了三个小时试图理解"(?<!^)(?=[A-Z])"如何按照大写字母进行分割,即

string[] s = Regex.Split("TheWorldWithoutStrangers", "(?<!^)(?=[A-Z])");

它是如何工作的!!我明白上面表达式中每个char的含义是什么,但我不知道它是如何一起工作的。为什么"(? < !^)([A-Z])"不起作用?这意味着每当你找到一个不在新行之后的大写字母,然后拆分,我是对的吗?

2 个答案:

答案 0 :(得分:4)

^表示行的开头,(?<!...)后面是负面看,因此(?<!^)匹配字符串中不在行首的任何位置

设置[A-Z]匹配任何大写字母,而(?=...)是正向前看,因此(?=[A-Z])匹配大写字母前面的字符串中的任何位置。

将它们组合在一起,表达式匹配字符串中不在行开头的任何位置,并且恰好在大写字母之前。

答案 1 :(得分:2)

这里的关键是(?<!...)(?=...)这两个部分是零宽度断言。第一个确保^(字符串的开头)不会在匹配位置之前发生,第二个确保[A-Z](单个大写字母)出现在匹配位置之后。实际匹配为空,因为这两个断言都没有实际匹配任何字符。整个表达式只匹配一个位置。