Я только что написал функцию, чтобы сделать именно это. :)
Заменить ([a-z])([A-Z])
на $1 $2
(или \1 \2
на других языках).
У меня также есть замена для ([A-Z]+)([A-Z][a-z])
- это преобразует такие вещи, как "NumberOfABCDThings" в "Number of ABCD Things"
Так что в C # это будет выглядеть примерно так:
Regex r1 = new Regex(@"([a-z])([A-Z])");
Regex r2 = new Regex(@"([A-Z]+)([A-Z][a-z])");
NewString = r1.Replace( InputString , "$1 $2");
NewString = r2.Replace( NewString , "$1 $2");
(хотя, возможно, есть более хитрый способ написать это)
Если у вас могут быть знаки препинания или цифры, я думаю, вы могли бы попробовать ([^A-Z])([A-Z])
для первого совпадения.
Хммм, еще один способ написания этих регулярных выражений с использованием lookbehind и lookahead, это просто сопоставить позицию и вставить пробел - то есть (?<=[a-z])(?=[A-Z])
и (?<=[A-Z]+)(?=[A-Z][a-z])
и в обоих случаях заменить просто "" - не уверен Может быть преимущества этого метода, но это интересный способ. :)