ฉันจะตัดเครื่องหมายวรรคตอนทั้งหมดออกจากสตริงใน JavaScript โดยใช้ regex ได้อย่างไร


152

หากฉันมีสตริงที่มีอักขระที่ไม่ใช่ตัวอักษรและตัวเลขในประเภท:

"This., -/ is #! an $ % ^ & * example ;: {} of a = -_ string with `~)() punctuation"

ฉันจะรับรุ่นที่ไม่มีเครื่องหมายวรรคตอนใน JavaScript ได้อย่างไร:

"This is an example of a string with punctuation"

คำตอบ:


211

หากคุณต้องการลบเครื่องหมายวรรคตอนที่เฉพาะเจาะจงออกจากสตริงมันอาจเป็นการดีที่สุดที่จะลบสิ่งที่คุณต้องการอย่างชัดเจน

replace(/[.,\/#!$%\^&\*;:{}=\-_`~()]/g,"")

การดำเนินการด้านบนยังคงไม่ส่งคืนสตริงตามที่คุณระบุไว้ หากคุณต้องการลบช่องว่างเพิ่มเติมที่เหลือจากการลบเครื่องหมายวรรคตอนบ้าคุณจะต้องทำบางสิ่งเช่น

replace(/\s{2,}/g," ");

ตัวอย่างเต็มของฉัน:

var s = "This., -/ is #! an $ % ^ & * example ;: {} of a = -_ string with `~)() punctuation";
var punctuationless = s.replace(/[.,\/#!$%\^&\*;:{}=\-_`~()]/g,"");
var finalString = punctuationless.replace(/\s{2,}/g," ");

ผลลัพธ์ของการเรียกใช้รหัสในคอนโซล firebug:

ข้อความแสดงแทน


4
เครื่องหมายปีกกาแบบโค้งใน regex จะใช้ตัวระบุปริมาณกับสิ่งก่อนหน้าดังนั้นในกรณีนี้มันจะแทนที่อักขระระหว่างช่องว่าง 2 ถึง 100 ตัว ( \s) ด้วยช่องว่างเดียว หากคุณต้องการที่จะยุบหมายเลขใด ๆ ของตัวละครช่องว่างลงไปหนึ่งคุณจะออกนอกขีด จำกัด replace(/\s{2,}/g, ' ')บนเพื่อต้องการ:
Mike Partridge

13
ฉันได้เพิ่มตัวอักษรอีกไม่กี่ไปยังรายการของเครื่องหมายวรรคตอนแทนที่ ( ):@+?><[]+ replace(/[\.,-\/#!$%\^&\*;:{}=\-_`~()@\+\?><\[\]\+]/g, '')หากใครกำลังมองหาชุดที่ค่อนข้างสมบูรณ์มากกว่า
timmfin

9
string.punctuation ของ Python กำหนดเครื่องหมายวรรคตอนเป็น: !"#$%&'()*+,-./:;<=>?@[\]^_`{|}~ซึ่งใช้งานได้ดีกว่าสำหรับฉันดังนั้นทางเลือกอื่นจะเป็น:replace(/['!"#$%&\\'()\*+,\-\.\/:;<=>?@\[\\\]\^_`{|}~']/g,"");
01AutoMonkey

1
@ AntoineLizéeฉันยอมรับว่ามันทำให้เข้าใจผิด อัปเดตคำตอบ ขอบคุณ
Mike Grace

2
ฉันเคยลองด้วย "มัน?" - ใช้งานไม่ได้สำหรับฉัน ( regex101.com/r/F4j5Qc/1 ) ทางออกที่ถูกต้องคือ: / [ \?] / g
Maxim Firsoff

129
str = str.replace(/[^\w\s]|_/g, "")
         .replace(/\s+/g, " ");

ลบทุกอย่างยกเว้นตัวอักษรและตัวเลขและช่องว่างจากนั้นย่อตัวอักขระหลายตัวที่อยู่ติดกันเป็นช่องว่างเดียว

คำอธิบายโดยละเอียด:

  1. \w เป็นตัวเลขตัวอักษรหรือขีดล่างใด ๆ
  2. \s ช่องว่างใด ๆ
  3. [^\w\s] คือสิ่งที่ไม่ใช่ตัวเลขตัวอักษรช่องว่างหรือขีดเส้นใต้
  4. [^\w\s]|_ เหมือนกับ # 3 ยกเว้นกับขีดล่างที่เพิ่มเข้ามา

72
สิ่งนี้จะตัดเอาอักขระที่ไม่ใช่ภาษาอังกฤษออกไป แต่อย่างอื่นเช่นตัวอักษรและตัวเลขเช่นà, é, öรวมถึงตัวอักษร Cyrillic ทั้งหมด
Dan Abramov

5
@quemeful ฉันไม่เห็นด้วยคำถามเดิมไม่ได้ระบุ "สำหรับภาษาอังกฤษเท่านั้น" ดังนั้นเป็นสากลใช้ทั่วทุกมุมโลก ทุกคนที่พูดภาษาอังกฤษและมีอินเทอร์เน็ตสามารถใช้งานได้ หากไม่ได้ระบุภาษาไว้ในคำถามเราไม่ควรตั้งสมมติฐานใด ๆ เราอยู่ในปี 2560 น่าเสียดาย!
Rolf

1
นอกจากนี้แม้ว่าคุณจะสนับสนุนภาษาอังกฤษเท่านั้นคุณมีคำยืมเช่นประวัติย่อและชื่อของสถานที่หรือผู้คนดังนั้นคุณจึงไม่ต้องการทำลายความสามารถของใครบางคนที่จะพูดว่าพวกเขาทำงานใน San Jose (การสะกดอย่างเป็นทางการ) ในห้องเล็ก ๆ ระหว่างRamónChloé
Chris Adams

นี้จะยุ่งกับคำเช่นwouldn'tและdon't
Charlie

71

นี่คืออักขระเครื่องหมายวรรคตอนมาตรฐานสำหรับ US-ASCII: !"#$%&'()*+,-./:;<=>?@[\]^_`{|}~

สำหรับเครื่องหมายวรรคตอน Unicode (เช่นเครื่องหมายคำพูดโค้ง, เครื่องหมายขีดกลาง em- ฯลฯ ) คุณสามารถจับคู่ในช่วงบล็อกเฉพาะ ทั่วไปเครื่องหมายวรรคตอนบล็อก\u2000-\u206Fและเสริมเครื่องหมายวรรคตอน\u2E00-\u2E7Fบล็อก

รวบรวมและหนีออกมาอย่างถูกต้องคุณจะได้รับ RegExp ต่อไปนี้:

/[\u2000-\u206F\u2E00-\u2E7F\\'!"#$%&()*+,\-.\/:;<=>?@\[\]^_`{|}~]/

นั่นควรตรงกับเครื่องหมายวรรคตอนที่คุณพบ ดังนั้นเพื่อตอบคำถามเดิม:

var punctRE = /[\u2000-\u206F\u2E00-\u2E7F\\'!"#$%&()*+,\-.\/:;<=>?@\[\]^_`{|}~]/g;
var spaceRE = /\s+/g;
var str = "This, -/ is #! an $ % ^ & * example ;: {} of a = -_ string with `~)() punctuation";
str.replace(punctRE, '').replace(spaceRE, ' ');

>> "This is an example of a string with punctuation"

แหล่ง US-ASCII: http://docs.oracle.com/javase/7/docs/api/java/util/regex/Pattern.html#posix

แหล่งที่มาของ Unicode: http://kourge.net/projects/regexp-unicode-block


3
สำหรับเครื่องหมายวรรคตอน Unicode บล็อกไม่เพียงพอ คุณต้องดูเครื่องหมายวรรคตอนหมวดหมู่ทั่วไปและคุณจะเห็นว่าเครื่องหมายวรรคตอนไม่ได้อยู่ในบล็อคเหล่านั้น มีเครื่องหมายวรรคตอนที่คุ้นเคยมากมายภายในบล็อกละตินเช่น
nhahtdh

15

/ [^ A-Za-z0-9 \ s] / g ควรตรงกับเครื่องหมายวรรคตอนทั้งหมด แต่ให้เว้นวรรค ดังนั้นคุณสามารถใช้.replace(/\s{2,}/g, " ")เพื่อแทนที่ช่องว่างเพิ่มเติมหากคุณต้องการ คุณสามารถทดสอบ regex ได้ที่http://rubular.com/

.replace(/[^A-Za-z0-9\s]/g,"").replace(/\s{2,}/g, " ")

อัปเดต : จะใช้งานได้หากอินพุตเป็น ANSI English


6
คุณกำลังสมมติว่าสตริงเป็น ANSI English ไม่ใช่ภาษาฝรั่งเศสที่มีตัวอักษรเน้นเสียง (àéô) หรือเยอรมัน, ตุรกี Unicode อาหรับจีน ฯลฯ ก็จะหายไปเช่นกัน
Rolf

2
ขอบคุณไม่คิดอย่างนั้นอย่างสมบูรณ์
adnan2nd

10

ฉันเจอปัญหาเดียวกันวิธีนี้ใช้เคล็ดลับและอ่านง่ายมาก:

var sentence = "This., -/ is #! an $ % ^ & * example ;: {} of a = -_ string with `~)() punctuation";
var newSen = sentence.match(/[^_\W]+/g).join(' ');
console.log(newSen);

ผลลัพธ์:

"This is an example of a string with punctuation"

เคล็ดลับคือการสร้างชุดที่ถูกทำให้ไร้ผล ซึ่งหมายความว่ามันตรงกับสิ่งใดก็ตามที่ไม่อยู่ภายในชุด[^abc]- ไม่ใช่a, bหรือc

\Wเป็นใด ๆ ที่ไม่ใช่คำพูดและ[^\W]+จะลบล้างสิ่งที่ไม่ได้เป็นคำถ่านถ่าน

โดยการเพิ่มใน _ (ขีดล่าง) คุณสามารถปฏิเสธได้เช่นกัน

ทำให้ใช้งานได้ทั่วโลก/gจากนั้นคุณสามารถเรียกใช้สตริงใด ๆ ผ่านมันและลบเครื่องหมายวรรคตอน:

/[^_\W]+/g

ดีและสะอาด;)


1
คุณยังเปลี่ยนบรรทัดใหม่ทั้งหมดเป็นช่องว่างด้วยวิธีนี้
nhahtdh

5
วิธีนี้ใช้ได้เป็นภาษาอังกฤษเท่านั้นอักขระที่เน้นเสียงทั้งหมดจะถูกลบออก
NicolasBernier

@NicolasBernier ใช่แล้วมันถูกต้อง 100% - เครื่องมือ regex ของ JavaScript นั้นค่อนข้างง่อยจริง ๆ (ดู: stackoverflow.com/questions/4043307/ ...... ) - น่าเสียดายสำหรับงานที่ซับซ้อนมากขึ้น รหัสเพิ่มเติม ยังคงหา regex อย่างรวดเร็วและรัดกุมเพื่อแถบเครื่องหมายวรรคตอนมันทำงาน :)
jacobedawson

นี่เป็นจุดประสงค์ที่ง่ายที่สุดและตอบสนองวัตถุประสงค์ของฉันได้ดี
James Shrum

9

ฉันจะเอามันมาที่นี่เพื่อคนอื่น

จับคู่เครื่องหมายวรรคตอนทั้งหมดสำหรับทุกภาษา:

สร้างจากหมวดหมู่เครื่องหมายวรรคตอน Unicode และเพิ่มสัญลักษณ์แป้นพิมพ์ทั่วไปบางอย่างเช่น$และเครื่องหมายวงเล็บและ\-=_

http://www.fileformat.info/info/unicode/category/Po/list.htm

แทนที่ขั้นพื้นฐาน:

".test'da, te\"xt".replace(/[\-=_!"#%&'*{},.\/:;?\(\)\[\]@\\$\^*+<>~`\u00a1\u00a7\u00b6\u00b7\u00bf\u037e\u0387\u055a-\u055f\u0589\u05c0\u05c3\u05c6\u05f3\u05f4\u0609\u060a\u060c\u060d\u061b\u061e\u061f\u066a-\u066d\u06d4\u0700-\u070d\u07f7-\u07f9\u0830-\u083e\u085e\u0964\u0965\u0970\u0af0\u0df4\u0e4f\u0e5a\u0e5b\u0f04-\u0f12\u0f14\u0f85\u0fd0-\u0fd4\u0fd9\u0fda\u104a-\u104f\u10fb\u1360-\u1368\u166d\u166e\u16eb-\u16ed\u1735\u1736\u17d4-\u17d6\u17d8-\u17da\u1800-\u1805\u1807-\u180a\u1944\u1945\u1a1e\u1a1f\u1aa0-\u1aa6\u1aa8-\u1aad\u1b5a-\u1b60\u1bfc-\u1bff\u1c3b-\u1c3f\u1c7e\u1c7f\u1cc0-\u1cc7\u1cd3\u2016\u2017\u2020-\u2027\u2030-\u2038\u203b-\u203e\u2041-\u2043\u2047-\u2051\u2053\u2055-\u205e\u2cf9-\u2cfc\u2cfe\u2cff\u2d70\u2e00\u2e01\u2e06-\u2e08\u2e0b\u2e0e-\u2e16\u2e18\u2e19\u2e1b\u2e1e\u2e1f\u2e2a-\u2e2e\u2e30-\u2e39\u3001-\u3003\u303d\u30fb\ua4fe\ua4ff\ua60d-\ua60f\ua673\ua67e\ua6f2-\ua6f7\ua874-\ua877\ua8ce\ua8cf\ua8f8-\ua8fa\ua92e\ua92f\ua95f\ua9c1-\ua9cd\ua9de\ua9df\uaa5c-\uaa5f\uaade\uaadf\uaaf0\uaaf1\uabeb\ufe10-\ufe16\ufe19\ufe30\ufe45\ufe46\ufe49-\ufe4c\ufe50-\ufe52\ufe54-\ufe57\ufe5f-\ufe61\ufe68\ufe6a\ufe6b\uff01-\uff03\uff05-\uff07\uff0a\uff0c\uff0e\uff0f\uff1a\uff1b\uff1f\uff20\uff3c\uff61\uff64\uff65]+/g,"")
"testda text"

เพิ่ม \ s เป็นพื้นที่

".da'fla, te\"te".split(/[\s\-=_!"#%&'*{},.\/:;?\(\)\[\]@\\$\^*+<>~`\u00a1\u00a7\u00b6\u00b7\u00bf\u037e\u0387\u055a-\u055f\u0589\u05c0\u05c3\u05c6\u05f3\u05f4\u0609\u060a\u060c\u060d\u061b\u061e\u061f\u066a-\u066d\u06d4\u0700-\u070d\u07f7-\u07f9\u0830-\u083e\u085e\u0964\u0965\u0970\u0af0\u0df4\u0e4f\u0e5a\u0e5b\u0f04-\u0f12\u0f14\u0f85\u0fd0-\u0fd4\u0fd9\u0fda\u104a-\u104f\u10fb\u1360-\u1368\u166d\u166e\u16eb-\u16ed\u1735\u1736\u17d4-\u17d6\u17d8-\u17da\u1800-\u1805\u1807-\u180a\u1944\u1945\u1a1e\u1a1f\u1aa0-\u1aa6\u1aa8-\u1aad\u1b5a-\u1b60\u1bfc-\u1bff\u1c3b-\u1c3f\u1c7e\u1c7f\u1cc0-\u1cc7\u1cd3\u2016\u2017\u2020-\u2027\u2030-\u2038\u203b-\u203e\u2041-\u2043\u2047-\u2051\u2053\u2055-\u205e\u2cf9-\u2cfc\u2cfe\u2cff\u2d70\u2e00\u2e01\u2e06-\u2e08\u2e0b\u2e0e-\u2e16\u2e18\u2e19\u2e1b\u2e1e\u2e1f\u2e2a-\u2e2e\u2e30-\u2e39\u3001-\u3003\u303d\u30fb\ua4fe\ua4ff\ua60d-\ua60f\ua673\ua67e\ua6f2-\ua6f7\ua874-\ua877\ua8ce\ua8cf\ua8f8-\ua8fa\ua92e\ua92f\ua95f\ua9c1-\ua9cd\ua9de\ua9df\uaa5c-\uaa5f\uaade\uaadf\uaaf0\uaaf1\uabeb\ufe10-\ufe16\ufe19\ufe30\ufe45\ufe46\ufe49-\ufe4c\ufe50-\ufe52\ufe54-\ufe57\ufe5f-\ufe61\ufe68\ufe6a\ufe6b\uff01-\uff03\uff05-\uff07\uff0a\uff0c\uff0e\uff0f\uff1a\uff1b\uff1f\uff20\uff3c\uff61\uff64\uff65]+/g)

เพิ่ม ^ เพื่อ invert patternt เพื่อให้ตรงกับไม่ใช่เครื่องหมายวรรคตอน แต่คำเหล่านั้นเป็นองค์ประกอบ

".test';the, te\"xt".match(/[^\s\-=_!"#%&'*{},.\/:;?\(\)\[\]@\\$\^*+<>~`\u00a1\u00a7\u00b6\u00b7\u00bf\u037e\u0387\u055a-\u055f\u0589\u05c0\u05c3\u05c6\u05f3\u05f4\u0609\u060a\u060c\u060d\u061b\u061e\u061f\u066a-\u066d\u06d4\u0700-\u070d\u07f7-\u07f9\u0830-\u083e\u085e\u0964\u0965\u0970\u0af0\u0df4\u0e4f\u0e5a\u0e5b\u0f04-\u0f12\u0f14\u0f85\u0fd0-\u0fd4\u0fd9\u0fda\u104a-\u104f\u10fb\u1360-\u1368\u166d\u166e\u16eb-\u16ed\u1735\u1736\u17d4-\u17d6\u17d8-\u17da\u1800-\u1805\u1807-\u180a\u1944\u1945\u1a1e\u1a1f\u1aa0-\u1aa6\u1aa8-\u1aad\u1b5a-\u1b60\u1bfc-\u1bff\u1c3b-\u1c3f\u1c7e\u1c7f\u1cc0-\u1cc7\u1cd3\u2016\u2017\u2020-\u2027\u2030-\u2038\u203b-\u203e\u2041-\u2043\u2047-\u2051\u2053\u2055-\u205e\u2cf9-\u2cfc\u2cfe\u2cff\u2d70\u2e00\u2e01\u2e06-\u2e08\u2e0b\u2e0e-\u2e16\u2e18\u2e19\u2e1b\u2e1e\u2e1f\u2e2a-\u2e2e\u2e30-\u2e39\u3001-\u3003\u303d\u30fb\ua4fe\ua4ff\ua60d-\ua60f\ua673\ua67e\ua6f2-\ua6f7\ua874-\ua877\ua8ce\ua8cf\ua8f8-\ua8fa\ua92e\ua92f\ua95f\ua9c1-\ua9cd\ua9de\ua9df\uaa5c-\uaa5f\uaade\uaadf\uaaf0\uaaf1\uabeb\ufe10-\ufe16\ufe19\ufe30\ufe45\ufe46\ufe49-\ufe4c\ufe50-\ufe52\ufe54-\ufe57\ufe5f-\ufe61\ufe68\ufe6a\ufe6b\uff01-\uff03\uff05-\uff07\uff0a\uff0c\uff0e\uff0f\uff1a\uff1b\uff1f\uff20\uff3c\uff61\uff64\uff65]+/g)

สำหรับภาษาอย่างฮีบรูอาจจะลบเครื่องหมายคำพูดเดี่ยวและคำสองคำ "" และคิดให้มากขึ้น

ใช้สคริปต์นี้:

ขั้นตอนที่ 1: เลือกใน Firefox โฮลดิ้งควบคุมคอลัมน์ของหมายเลข U + 1234 และคัดลอกอย่าคัดลอก U + 12456 พวกเขาแทนที่ภาษาอังกฤษ

ขั้นตอนที่ 2 (ฉันทำด้วยโครเมี่ยม) ค้นหา textarea และวางลงในมันจากนั้นคลิกขวาและคลิกตรวจสอบ จากนั้นคุณสามารถเข้าถึงองค์ประกอบที่เลือกด้วย $ 0

var x=$0.value
var z=x.replace(/U\+/g,"").split(/[\r\n]+/).map(function(a){return parseInt(a,16)})
var ret=[];z.forEach(function(a,k){if(z[k-1]===a-1 && z[k+1]===a+1) { if(ret[ret.length-1]!="-")ret.push("-");} else {  var c=a.toString(16); var prefix=c.length<3?"\\u0000":c.length<5?"\\u0000":"\\u000000"; var uu=prefix.substring(0,prefix.length-c.length)+c; ret.push(c.length<3?String.fromCharCode(a):uu)}});ret.join("")

ขั้นตอนที่ 3 คัดลอกมาจากตัวอักษรตัวแรกที่ ascii เป็นตัวอักษรแยกกันไม่ใช่ช่วงเพราะบางคนอาจเพิ่มหรือลบตัวอักษรแต่ละตัว


7

ในภาษาที่รับรู้ Unicode คุณสมบัติอักขระเครื่องหมายวรรคตอน Unicode คือ\p{P}- ซึ่งโดยปกติคุณสามารถย่อ\pPและบางครั้งขยายเป็น\p{Punctuation}ให้อ่านได้

คุณใช้ไลบรารี Expression Regular Expression หรือไม่


8
น่าเสียดายที่ JS ไม่รองรับ Perl ปัญหาอื่น ๆ คือเมื่อผมทดสอบนี้มันก็ไม่ได้จับภาพทั้งหมดของเครื่องหมายวรรคตอนในการทดสอบ @ สตริงเควนตินของ => mikegrace.s3.amazonaws.com/forums/stack-overflow/...
ไมค์เกรซ

4
คุณสามารถใช้ไลบรารี XRegExp เพื่อรับไวยากรณ์เพิ่มเติมนี้
Eirik Birkeland

7

หากคุณต้องการลบเครื่องหมายวรรคตอนออกจากสตริงใด ๆ คุณควรใช้Pคลาส Unicode

แต่เนื่องจากคลาสไม่ได้รับการยอมรับใน JavaScript RegEx คุณสามารถลองใช้ RegEx นี้ที่ควรตรงกับเครื่องหมายวรรคตอนทั้งหมด มันตรงกับหมวดหมู่ต่อไปนี้: PC Pd Pe Pf Pi Po Ps Sc Sk Sm ดังนั้นทั่วไปเครื่องหมายวรรคตอนเสริมเครื่องหมายวรรคตอน CJKSymbolsAndPunctuation Cuneiform ตัวเลขและเครื่องหมายวรรคตอน

ฉันสร้างโดยใช้เครื่องมือออนไลน์นี้ที่สร้างนิพจน์ปกติสำหรับ JavaScript โดยเฉพาะ นี่คือรหัสเพื่อให้บรรลุเป้าหมายของคุณ:

var punctuationRegEx = /[!-/:-@[-`{-~¡-©«-¬®-±´¶-¸»¿×÷˂-˅˒-˟˥-˫˭˯-˿͵;΄-΅·϶҂՚-՟։-֊־׀׃׆׳-״؆-؏؛؞-؟٪-٭۔۩۽-۾܀-܍߶-߹।-॥॰৲-৳৺૱୰௳-௺౿ೱ-ೲ൹෴฿๏๚-๛༁-༗༚-༟༴༶༸༺-༽྅྾-࿅࿇-࿌࿎-࿔၊-၏႞-႟჻፠-፨᎐-᎙᙭-᙮᚛-᚜᛫-᛭᜵-᜶។-៖៘-៛᠀-᠊᥀᥄-᥅᧞-᧿᨞-᨟᭚-᭪᭴-᭼᰻-᰿᱾-᱿᾽᾿-῁῍-῏῝-῟῭-`´-῾\u2000-\u206e⁺-⁾₊-₎₠-₵℀-℁℃-℆℈-℉℔№-℘℞-℣℥℧℩℮℺-℻⅀-⅄⅊-⅍⅏←-⏧␀-␦⑀-⑊⒜-ⓩ─-⚝⚠-⚼⛀-⛃✁-✄✆-✉✌-✧✩-❋❍❏-❒❖❘-❞❡-❵➔➘-➯➱-➾⟀-⟊⟌⟐-⭌⭐-⭔⳥-⳪⳹-⳼⳾-⳿⸀-\u2e7e⺀-⺙⺛-⻳⼀-⿕⿰-⿻\u3000-〿゛-゜゠・㆐-㆑㆖-㆟㇀-㇣㈀-㈞㈪-㉃㉐㉠-㉿㊊-㊰㋀-㋾㌀-㏿䷀-䷿꒐-꓆꘍-꘏꙳꙾꜀-꜖꜠-꜡꞉-꞊꠨-꠫꡴-꡷꣎-꣏꤮-꤯꥟꩜-꩟﬩﴾-﴿﷼-﷽︐-︙︰-﹒﹔-﹦﹨-﹫!-/:-@[-`{-・¢-₩│-○-�]|\ud800[\udd00-\udd02\udd37-\udd3f\udd79-\udd89\udd90-\udd9b\uddd0-\uddfc\udf9f\udfd0]|\ud802[\udd1f\udd3f\ude50-\ude58]|\ud809[\udc00-\udc7e]|\ud834[\udc00-\udcf5\udd00-\udd26\udd29-\udd64\udd6a-\udd6c\udd83-\udd84\udd8c-\udda9\uddae-\udddd\ude00-\ude41\ude45\udf00-\udf56]|\ud835[\udec1\udedb\udefb\udf15\udf35\udf4f\udf6f\udf89\udfa9\udfc3]|\ud83c[\udc00-\udc2b\udc30-\udc93]/g;
var string = "This., -/ is #! an $ % ^ & * example ;: {} of a = -_ string with `~)() punctuation";
var newString = string.replace(punctuationRegEx, '').replace(/(\s){2,}/g, '$1');
console.log(newString)


5

สำหรับสตริง en-US (ภาษาอังกฤษแบบอเมริกัน) สิ่งนี้น่าจะพอเพียง:

"This., -/ is #! an $ % ^ & * example ;: {} of a = -_ string with `~)() punctuation".replace( /[^a-zA-Z ]/g, '').replace( /\s\s+/g, ' ' )

โปรดระวังว่าถ้าคุณรองรับ UTF-8 และตัวอักษรอย่างจีน / รัสเซียและทั้งหมดนี้จะแทนที่ด้วยเช่นกันดังนั้นคุณต้องระบุสิ่งที่คุณต้องการจริงๆ


3

ถ้าคุณใช้lodash

_.words('This, is : my - test,line:').join(' ')

ตัวอย่างนี้

_.words('"This., -/ is #! an $ % ^ & * example ;: {} of a = -_ string with `~)() punctuation"').join(' ')

2

ตามรายการของวิกิพีเดียของเครื่องหมายวรรคตอนฉันต้องสร้าง regex ต่อไปนี้ซึ่งตรวจจับเครื่องหมายวรรคตอน:

[\.’'\[\](){}⟨⟩:,،、‒–—―…!.‹›«»‐\-?‘’“”'";/⁄·\&*@\•^†‡°”¡¿※#№÷׺ª%‰+−=‱¶′″‴§~_|‖¦©℗®℠™¤₳฿₵¢₡₢$₫₯֏₠€ƒ₣₲₴₭₺₾ℳ₥₦₧₱₰£៛₽₹₨₪৳₸₮₩¥]


2
หากใช้ regex นี้คุณควรหลีกเลี่ยงตัวคั่น regex ของคุณ ตัวอย่างเช่นถ้าคุณใช้/(ทั่วไป) \/แล้วก็ควรที่จะหนีออกมาภายในชั้นเรียนตัวอักษรดังกล่าวข้างต้นโดยการเพิ่มหลังเฉือนก่อนเช่นนี้ "String!! With, Punctuation.".replace(/[\.’'\[\](){}⟨⟩:,،、‒–—―…!.‹›«»‐\-?‘’“”'";\/⁄·\&*@\•^†‡°”¡¿※#№÷׺ª%‰+−=‱¶′″‴§~_|‖¦©℗®℠™¤₳฿₵¢₡₢$₫₯֏₠€ƒ₣₲₴₭₺₾ℳ₥₦₧₱₰£៛₽₹₨₪৳₸₮₩¥]+/g,"")นี่คือวิธีที่คุณจะใช้มัน โดยวิธีการที่ฉันไม่เห็น backtick (`) ที่ใดก็ได้ในนั้นทำไม?
Rolf

ที่ขาดหายไป. ดูเหมือนว่าจะยากที่จะหารายการของเครื่องหมายวรรคตอนทั้งหมด
อเล็กซ์

1

หากคุณต้องการเก็บตัวอักษรและช่องว่างเท่านั้นคุณสามารถทำได้:

str.replace(/[^a-zA-Z ]+/g, '').replace('/ {2,}/',' ')

8
จะไม่ดึงมากกว่าเครื่องหมายวรรคตอนใช่หรือไม่ Unicode และชอบ?
Alex

3
คุณหมายถึง " ตัวอักษรภาษาอังกฤษเท่านั้นและช่องว่าง"
Rolf

0

ขึ้นอยู่กับสิ่งที่คุณพยายามคืน ฉันใช้สิ่งนี้เมื่อเร็ว ๆ นี้:

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