我花了三个小时试图理解"(?<!^)(?=[A-Z])"
如何按照大写字母进行分割,即
string[] s = Regex.Split("TheWorldWithoutStrangers", "(?<!^)(?=[A-Z])");
它是如何工作的!!我明白上面表达式中每个char的含义是什么,但我不知道它是如何一起工作的。为什么"(? < !^)([A-Z])"
不起作用?这意味着每当你找到一个不在新行之后的大写字母,然后拆分,我是对的吗?
答案 0 :(得分:4)
^
表示行的开头,(?<!...)
后面是负面看,因此(?<!^)
匹配字符串中不在行首的任何位置
设置[A-Z]
匹配任何大写字母,而(?=...)
是正向前看,因此(?=[A-Z])
匹配大写字母前面的字符串中的任何位置。
将它们组合在一起,表达式匹配字符串中不在行开头的任何位置,并且恰好在大写字母之前。
答案 1 :(得分:2)
这里的关键是(?<!...)
和(?=...)
这两个部分是零宽度断言。第一个确保^
(字符串的开头)不会在匹配位置之前发生,第二个确保[A-Z]
(单个大写字母)出现在匹配位置之后。实际匹配为空,因为这两个断言都没有实际匹配任何字符。整个表达式只匹配一个位置。