แทรกช่องว่างก่อนตัวพิมพ์ใหญ่


99

"MySites"ฉันมีสตริง ฉันต้องการที่จะวางช่องว่างระหว่างและMySites

ฉันจะทำสิ่งนี้ใน jQuery หรือ JavaScript ได้อย่างไร


1
คุณสามารถให้รายละเอียดเพิ่มเติมได้หรือไม่? รูปแบบทั่วไปของสตริงที่คุณต้องการแยกคืออะไร? หากเป็นเพียงสตริงเดียวทำไมไม่ใส่ช่องว่างด้วยตนเอง
Pointy

2
โปรดพูดให้ละเอียดกว่านี้ฉันไม่คิดว่าจะมีใครเข้าใจสิ่งที่คุณถาม
Clement Herreman

1
กำหนดรูปแบบที่ควรจับคู่เช่น "ช่องว่างเมื่อพบ" ของฉัน "ในสตริง" หรือ "เพิ่มช่องว่างก่อนอักขระตัวพิมพ์ใหญ่แต่ละตัวเว้นแต่จะเป็นอักขระตัวแรก" หรือ ....
JohnSmith

"ระหว่าง MySites" คุณจะวางช่องว่างระหว่าง 1 สิ่งได้อย่างไร? ฉันคิดว่าคุณต้องการ "ไซต์ของฉัน" เป็นผลลัพธ์
Rocket Hazmat

#meagar - ความคิดเห็นที่ดี (ถากถาง) คุณไม่เคยสอนว่าถ้าคุณไม่มีอะไรดีที่จะพูดอย่าพูดอะไรเลย?
carinlynchin

คำตอบ:


176

คุณสามารถเพิ่มช่องว่างก่อนอักขระตัวพิมพ์ใหญ่ทุกตัวและตัดช่องว่างนำหน้าและต่อท้าย

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

นอกจากนี้ยังใช้ได้กับ "1AndAbove" วิธีแก้ปัญหาอื่น ๆ ไม่ได้ ขอบคุณ !!
One-One

1
มัน "ล้มเหลว" สำหรับคำย่อเราจะป้องกันไม่ให้มันทำงานเมื่อแคป 2 ตัวขึ้นไปติดต่อกันได้อย่างไร
Toni Michel Caubet

4
@ToniMichelCaubet ง่ายปรับเปลี่ยน regex ดังนี้: /([A-Z]+)/g. เครื่องหมาย + จะทำให้แน่ใจว่าคุณจับคู่ตัวพิมพ์ใหญ่ติดต่อกันให้มากที่สุด
iFreilicht

เหตุใดจึงต้องมีวงเล็บที่คุณใช้ล้อมรอบ "[AZ]" ในรหัสนี้
Kristina Bressler

1
@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"
Ceres

3
@Ceres: จุดดี กรณีที่อาจจะมีการจัดการโดยแทนการใส่ช่องว่างก่อนทุนใด ๆ ที่ไม่ได้เป็นตัวอักษรตัวแรก "RunThisSQLQuery"แต่คุณยังมีกรณีที่ไม่สามารถจัดการได้โดยไม่ต้องจดจำคำเช่น
Guffa

1
สำหรับ "ThisIsATest" - (ไม่นับ 'RunThisSQLQuery') คุณสามารถทำได้: str.replace (/ ([AZ]) / g, '$ 1'). trim ()
carinlynchin

ยอดเยี่ยม! ขอบคุณ!
Ami Schreiber

24

ฉันขอแนะนำให้แก้ไขเล็กน้อยสำหรับคำตอบที่ยอมรับในปัจจุบัน:

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จะมีค่าที่คุณต้องการ นอกจากนี้หากคุณต้องการย่อโค้ดโดยใช้ regex คุณสามารถใช้โค้ดต่อไปนี้จากJavascript camelCase เป็น Regular Form

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

5

regex เพื่อค้นหาตัวพิมพ์เล็ก - ขอบเขตตัวพิมพ์ใหญ่จากนั้นแทรกช่องว่าง

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

http://jsfiddle.net/uXy64/


3

นี่คือสิ่งที่ฉันใช้ในการแปลงสตริงเป็นตัวพิมพ์ใหญ่ตามคำตอบบางส่วนที่นี่:

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" -> "Another String Here"
  • "someones_string" -> "สตริง Someones"
  • "Another-String-Here" -> "Another String Here"
  • "myAWESOMEString" -> "สตริงที่น่ากลัวของฉัน"

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

ในการแทนที่ regex เดียว (โดยไม่ต้องจดจ้องหรือรวม) ที่อนุญาตให้อักขระใด ๆ ไม่ใช่แค่ตัวอักษร[a-z]หรือ[A-Z].

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

คุณสามารถตรวจสอบข้อมูลเพิ่มเติมเกี่ยวกับรูปลักษณ์ที่อยู่เบื้องหลังที่นี่(?<!^)

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.