Нет, вы не можете добиться замены, используя одну gsub
, потому что в одном из ваших требований вы хотите удалить все строчные буквы, начиная с начала, а ваше второе требование - вводить пробел перед каждой заглавной буквой, кроме первая заглавная буква результирующей строки после удаления всех строчных букв из начала текста.
Выполнение этого в одном вызове gsub
было бы возможно в тех случаях, когда каким-либо образом мы можем повторно использовать некоторые из существующих символов для условной замены, чего здесь не может быть. Таким образом, на первом шаге вы можете использовать ^[a-z]+
регулярное выражение, чтобы избавиться от всех строчных букв только с начала строки,
sub('^[a-z]+', '', "marchTextIWantToDisplayWithSpacesmarch")
оставив вас с этим,
[1] "TextIWantToDisplayWithSpacesmarch"
И на следующем шаге вы можете использовать это (?<!^)(?=[A-Z])
регулярное выражение, чтобы вставить пробел перед каждой заглавной буквой, кроме первой, поскольку вам может не потребоваться дополнительный пробел перед предложением. Но вы можете объединить оба и записать их так:
gsub('(?<!^)(?=[A-Z])', ' ', sub('^[a-z]+', '', "marchTextIWantToDisplayWithSpacesmarch"), perl=TRUE)
, который даст вам желаемую строку,
[1] "Text I Want To Display With Spacesmarch"
Edit:
Объяснение (?<!^)(?=[A-Z])
шаблон
Во-первых, давайте просто возьмем (?=[A-Z])
шаблон
См. Розовые маркеры в этой демонстрации
Как вы можете видеть, в демо каждой заглавной букве предшествует розовая метка, которая является местом, где будет вставлен пробел. Но мы не хотим вставлять пробел перед самой первой буквой, так как это не нужно. Следовательно, нам нужно условие в регулярном выражении, которое не выберет первую заглавную букву, которая появляется в начале строки. И для этого нам нужно использовать отрицательный взгляд за (?<!^)
, что означает, что Не выбирайте позицию, которой предшествует начало строки , и, следовательно, это (?<!^)
помогает отбрасывать заглавную букву, которая предшествует только начало строки.
См. Эту демонстрацию, где розовый маркер исчез из самой первой заглавной буквы
Надеюсь, это проясняет, как выбирается любая другая заглавная буква, но не самая первая. Дайте мне знать, если у вас есть какие-либо вопросы.