Як я можу викреслити всі розділові знаки з рядка в 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:

alt текст


4
Фігурні дужки в регулярному виразі застосовують кількісний показник до попереднього, тому в цьому випадку він замінює між 2 і 100 символами пробілу ( \s) одним пробілом. Якщо ви хочете , щоб згорнути будь-яку кількість символів пробілів аж до одного, ви б залишити підняти верхню межу наступним чином: replace(/\s{2,}/g, ' ').
Майк Партрідж

13
Я додав кілька символів в список знаків пунктуації замінити ( @+?><[]+): replace(/[\.,-\/#!$%\^&\*;:{}=\-_`~()@\+\?><\[\]\+]/g, ''). Якщо хтось шукає ще трохи-повніший набір.
теммфін

9
Python's string.punctuation визначає пунктуацію як: !"#$%&'()*+,-./:;<=>?@[\]^_`{|}~Що для мене краще, тому іншою альтернативою буде:replace(/['!"#$%&\\'()\*+,\-\.\/:;<=>?@\[\\\]\^_`{|}~']/g,"");
01AutoMonkey,

1
@ AntoineLizée Я згоден, що це вводить в оману. Оновлено відповідь. Дякую.
Майк Грейс

2
Я спробував з "це?" - не працює для мене ( regex101.com/r/F4j5Qc/1 ), правильним рішенням є: / evidence.,\/#!$%\^&* ;:{}=\-_ `~ () \?] / г
Максим Фірсофф

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

Видаляє все, крім буквено-цифрових символів та пробілів, а потім згортає кілька суміжних символів на одиничні пробіли.

Детальне пояснення:

  1. \w - будь-яка цифра, літера чи підкреслення.
  2. \s - будь-який пробіл.
  3. [^\w\s] це все, що не є цифрою, літерою, пробілом чи підкресленням.
  4. [^\w\s]|_ те саме, що №3, за винятком доданих підкреслень.

72
Це також викреслить неанглійські, але в іншому випадку ідеально буквено-цифрові символи, такі як à, é, ö, а також увесь кириличний алфавіт.
Дан Абрамов

5
@quemeful Я не згоден, оригінальне запитання не вказує "лише для англійської мови". ТАК досить міжнародна, використовується у всьому світі. Кожен, хто говорить англійською та має доступ до Інтернету, може користуватися нею. Якщо мова не вказана у питанні, то ми не повинні робити жодних припущень. Ми у 2017 році, чорт!
Рольф

1
Крім того, навіть якщо ви підтримуєте лише англійську мову, у вас є такі позивні слова, як резюме та назви місць чи людей, щоб ви не хотіли порушувати вміння когось сказати, що вони працюють у Сан-Хосе (офіційний правопис) у кабінці між Рамоном Хлое.
Кріс Адамс

Це wouldn'tdon't
Чарлі

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, " ")для заміни додаткових пробілів, якщо вам це потрібно. Ви можете протестувати регекс на http://rubular.com/

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

Оновлення : Працює лише в тому випадку, якщо вхід є англійською мовою ANSI.


6
Ви припускаєте, що рядок є англійською мовою ANSI. Не французька з наголошеними літерами (àéô), ні німецька, турецька. Unicode арабська, китайська тощо також також зникнуть.
Рольф

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% правильно - двигун регулярних виразів JavaScript насправді дуже кульгавий (див.: Stackoverflow.com/questions/4043307/… ) - на жаль, для складніших завдань (а також для створення шаблонів для неанглійських слів) потрібно трохи більше коду. І все-таки для швидкого та лаконічного регексу для зняття пунктуації це працює :)
jacobedawson

Це було найпростіше і добре служило моєму призначенню.
Джеймс Шрум

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)

додано ^, щоб перевернути шаблон, щоб не відповідати розділові знаки, а самі слова

".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 (я робив у хромі) знайдіть текстову область та вставте її, потім клацніть правою кнопкою миші та натисніть кнопку перевірити. то ви можете отримати доступ до обраного елемента з 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 скопіював над першими літерами асції як окремі символи не діапазони, тому що хтось може додавати або видаляти окремі символи


7

У мові, що обізнана з Unicode, властивість символів пунктуації Unicode \p{P}- це - яку ви можете звичайно скоротити, \pPа іноді й розширити до \p{Punctuation}читабельності.

Використовуєте бібліотеку регулярних виразів сумісної Perl?


8
На жаль, JS не сумісний з Perl. Інша проблема, коли я перевірив це, він не зафіксував усі пунктуації в тестовому рядку @ Quentin => mikegrace.s3.amazonaws.com/forums/stack-overflow/…
Майк Грейс

4
Ви можете використовувати бібліотеку XRegExp, щоб отримати цей розширений синтаксис.
Ейрік Біркеланд

7

Якщо ви хочете видалити розділові знаки з будь-якого рядка, вам слід скористатися Pкласом Unicode.

Але, оскільки класи не приймаються в JavaScript RegEx, ви можете спробувати цей RegEx, який повинен відповідати всім пунктуаційним. Він відповідає наступним категоріям: Pc Pd Pe Pf Pi Po Ps Sc Sk См. Загальнафункціональна доповненняPunctuation CJKSymbolsіPunctuation CuneiformNumbersAndPunctuation.

Я створив його за допомогою цього інструменту в Інтернеті, який генерує регулярні вирази спеціально для 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 (American English) цього має бути достатньо:

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

Майте на увазі, що якщо ви підтримуєте UTF-8 та такі символи, як китайська / російська та все, це також замінить їх, тому вам дійсно доведеться вказати, що ви хочете.


3

якщо ви використовуєте лодаш

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

Цей приклад

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

2

Відповідно до списку пунктуацій Вікіпедії, я повинен був побудувати наступний регулярний вираз, який визначає пунктуації:

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


2
Якщо ви використовуєте цей регулярний вираз, вам слід також уникати свого розділювача. Наприклад, якщо ви використовуєте /(найчастіше) , то він повинен бути екранований всередині символьного класу вище, додавши зворотний слеш перед тим , як це: \/. Це, як ви б використовувати: "String!! With, Punctuation.".replace(/[\.’'\[\](){}⟨⟩:,،、‒–—―…!.‹›«»‐\-?‘’“”'";\/⁄·\&*@\•^†‡°”¡¿※#№÷׺ª%‰+−=‱¶′″‴§~_|‖¦©℗®℠™¤₳฿₵¢₡₢$₫₯֏₠€ƒ₣₲₴₭₺₾ℳ₥₦₧₱₰£៛₽₹₨₪৳₸₮₩¥]+/g,""). До речі, я ніде не бачу backtick (`), як там?
Рольф

відсутня. Здається, важко знайти список усіх пунктуацій.
Олексій

1

Якщо ви хочете зберегти лише алфавіти та пробіли, ви можете зробити:

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

8
Хіба це не витягне більше, ніж просто розділові знаки? Unicode тощо?
Олексій

3
Ви маєте на увазі "лише англійські алфавіти та пробіли"
Рольф

0

Це залежить від того, що ви намагаєтеся повернути. Я цим нещодавно користувався:

return text.match(/[a-z]/i);
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.