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


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.