2012-06-03 2 views
3

я провел как три часа, пытаясь understant, как это "(?<!^)(?=[A-Z])" работает разделить на Тринг в соответствии с прописными буквами, т.е.регулярное выражение «(? <! ^) (? = [AZ])»

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

Как делает это работает! Я понимаю, в чем смысл каждого символа в приведенном выше выражении, но я не понимаю, как он работает вместе. почему "(? < !^)([A-Z])" не работает? это означает, что всякий раз, когда вы находите печатное письмо, которое не после новой строки, тогда раскол, я прав?

+0

Что именно вы пытаетесь сделать? – Shai

+2

Читайте о регулярном выражении [Lookbehind and Lookahead] (http://www.codeproject.com/Articles/9099/The-30-Minute-Regex-Tutorial). – SimpleVar

+0

Я хочу, чтобы массив s имел значения {The, World, Без, Незнакомцы} – Emo

ответ

2

Ключ здесь состоит в том, что две части (?<!...) и (?=...) являются утверждениями с нулевой шириной. Первый гарантирует, что ^ (начало строки) не будет происходить непосредственно перед позицией матча, а второй гарантирует, что [A-Z] (одиночная заглавная буква) появится сразу после позиции матча. Фактическое совпадение пуст, потому что ни одно из утверждений не соответствует любым символам. Все выражение просто соответствует позиции.

4

^ означает начало строки, а (?<!...) негативный взгляд позади, так (?<!^) соответствует любой позиции в строке, которая не в самом начале строки.

Комплект [A-Z] соответствует любой прописной букве, а (?=...) - положительный взгляд вперед, поэтому (?=[A-Z]) соответствует любому положению в строке, которая находится прямо перед заглавной буквой.

Поместите их вместе, и выражение соответствует любому положению в строке, которая не соответствует началу строки, и это прямо перед заглавной буквой.

+0

Почему не "(? Emo

+0

Вы должны убедиться, что ничто в регулярном выражении фактически не соответствует подстроке в вашей строке, потому что соответствующая часть удаляется из вывода. – JohnB

+1

@imad: Это будет включать в себя заглавную букву в матче. Используя только внешний вид и взгляд вперед, выражение соответствует позиции между заглавной буквой и символом до этого. Поскольку совпадение равно нулю, split не удаляет что-либо из строки, а результат имеет все символы из исходной строки. – Guffa

Смежные вопросы