Вставте пробіл перед великими літерами


96

У мене є струна "MySites". Я хочу розмістити простір між Myі Sites.

Як я можу це зробити в jQuery або JavaScript?


1
Ви можете надати детальну інформацію? Яка загальна форма рядків, які ви хочете відокремити? Якщо це лише один рядок, чому б просто не вставити простір вручну?
— Пойнті

2
Будь ласка, будь точнішим, я не думаю, що хтось може зрозуміти, про що ти просиш
— Клімент Герреман

1
визначити шаблон, якому він повинен відповідати, наприклад, "пробіл, коли він знаходить" My "у рядку" або "додавати пробіл перед кожним великим символом, якщо це не перший символ", або ....
— JohnSmith

"між MySites". Як можна розмістити пробіл між 1 річчю? Я припускаю, що ви хочете "Мої сайти" як результат.
— Racket Hazmat

#meagar - приємний коментар (сарказм). вас ніколи не вчили, що якщо у вас немає нічого приємного сказати, взагалі нічого не кажіть?
— carinlynchin

Відповіді:


167

Ви можете просто додати пробіл перед кожним великим символом і обрізати провідні та кінцеві пробіли

s = s.replace(/([A-Z])/g, ' $1').trim()

Це також працює для "1AndAbove". Інше рішення - ні. Дякую!!
— desaivv

1
Це "не вдається" для скорочень, як ми могли б запобігти його дії, якщо 2 або більше послідовних обмежень?
— Тоні Мішель Кабе

4
@ToniMichelCaubet легко, змінити регулярний вираз , як це: /([A-Z]+)/g. Знак + подбає про те, щоб ви відповідали якомога більшій кількості послідовних великих літер.
— iFreilicht

Чому в цьому коді потрібні дужки, які ви використовуєте для оточення "[AZ]"?
— Крістіна Бресслер

@Kristina У дужках сказано "Я - змінна". Без дужок він дає відповідь "$ 1y $ 1ites" для "MySites"
— user2051552

128

Це знайде кожне входження символу нижнього регістру, за яким слідує регістр, і вставить пробіл між ними:

s = s.replace(/([a-z])([A-Z])/g, '$1 $2');

Для особливих випадків, коли трапляються 2 послідовні великі літери (Наприклад: ThisIsATest), додайте нижче додатковий код:

 s = s.replace(/([A-Z])([A-Z])/g, '$1 $2');

3
Тільки попередження, це не вдається для окремих літер "ThisIsATest" призведе до "This Is ATest".
— Церера

3
@Ceres: Гарна думка. Цю справу можна було б вирішити, замість того, щоб вставити пробіл перед будь-яким капіталом, який не є першим символом, але у вас все ще є справи, які неможливо розглянути без розпізнавання слів, наприклад "RunThisSQLQuery".
— Гуффа

1
для "ThisIsATest" - (не враховуючи 'RunThisSQLQuery') ви можете зробити це: str.replace (/ ([AZ]) / g, '$ 1'). trim ()
— carinlynchin

Блискуче! Дякую!
— Ami Schreiber

21

Чи можу я запропонувати невелике редагування прийнятої зараз відповіді:

function insertSpaces(string) {
    string = string.replace(/([a-z])([A-Z])/g, '$1 $2');
    string = string.replace(/([A-Z])([A-Z][a-z])/g, '$1 $2')
    return string;
}

Це означає що:

ACROText -> ACRO Text
UserNameTest -> User Name Test

Що може бути трохи кориснішим, якщо ви маєте справу з назвами стовпців db (і використовуєте скорочення для деяких речей)


1
Це чудово працює для того, що мені було потрібно. Це чудово додало простір між великими літерами, але зберегло абревіатури разом.
— mighty_mite

6

Тут слід вставити пробіл між кожною великою літерою, перед яким не було великої літери.

var myString = "MySites"
var newString = "";
var wasUpper = false;
for (var i = 0; i < myString.length; i++)
{
    if (!wasUpper && myString[i] == myString.toUpperCase()[i])
    {
        newString = newString + " ";
        wasUpper = true;
    }
    else
    {
        wasUpper = false;
    }
    newString = newString + myString[i];
}

newStringматиме значення, яке ви хочете. Крім того, якщо ви хочете скоротити свій код за допомогою регулярного виразу , ви можете використовувати наступний код із Javascript camelCase до регулярної форми

"thisStringIsGood"
    // insert a space before all caps
    .replace(/([A-Z])/g, ' $1')
    // uppercase the first character
    .replace(/^./, function(str){ return str.toUpperCase(); })

5

регулярне вираження, щоб знайти малі регістри - межу верхнього регістру, потім вставте пробіл

<div id='x'>ThisIsMySites</div>
$('#x').text( $('#x').text().replace(/([a-z])([A-Z])/g, "$1 $2") );

http://jsfiddle.net/uXy64/


2

Ось що я використав для перетворення рядка у регістр заголовка, виходячи з декількох відповідей тут:

str = str
  .replace(/(_|-)/g, ' ')
  .trim()
  .replace(/\w\S*/g, function(str) {
    return str.charAt(0).toUpperCase() + str.substr(1)
  })   
  .replace(/([a-z])([A-Z])/g, '$1 $2')
  .replace(/([A-Z])([A-Z][a-z])/g, '$1 $2')   

Ось JSFiddle, де ви можете протестувати свій рядок, щоб перевірити, чи відповідає він вашим потребам: https://jsfiddle.net/thomastasa/5236dv8t/85/


Приклади:

  • "yourStringHere" -> "Ваш рядок тут"
  • "AnotherStringHere" -> "Ще один рядок тут"
  • "someones_string" -> "Someones String"
  • "Ще один рядок - тут" -> "Ще один рядок тут"
  • "myAWESOMEString" -> "My AWESOME String"

1

Ви можете використовувати String#split()і огляд вперед для великого алфавіту ( [A-Z]), а потім Array#join()масиву з пробілом:

let stringCamelCase = "MySites";

let string = stringCamelCase.split(/(?=[A-Z])/).join(" ");

console.log(string)

Або як функція String Object:

String.prototype.cC2SC = function() {
  return this.split(/(?=[A-Z])/).join(" ");
}

console.log("MyCamelCase".cC2SC());


1

В одному регулярному виразі заміни (без обрізки або об'єднання), що дозволяє будь-який символ, не тільки літери [a-z]або [A-Z].

const str = "MySites";
str.replace(/(?<!^)([A-Z])/, " $1"); // -> "My Sites"

Ви можете переглянути більше про зовнішній вигляд (?<!^) тут .

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.