web-dev-qa-db-fra.com

Comment puis-je supprimer toute ponctuation d'une chaîne en JavaScript à l'aide de regex?

Si j'ai une chaîne contenant n'importe quel type de caractère non alphanumérique: 

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

Comment pourrais-je obtenir une version sans ponctuation en JavaScript:

"This is an example of a string with punctuation"
131
Quentin Fisk

Si vous souhaitez supprimer une ponctuation spécifique d'une chaîne, il sera probablement préférable de supprimer explicitement ce que vous voulez.

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

Ce qui précède ne renvoie toujours pas la chaîne telle que vous l'avez spécifiée. Si vous souhaitez supprimer les espaces supplémentaires qui restent de la suppression de la ponctuation folle, vous souhaiterez faire quelque chose comme

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

Mon exemple complet:

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

Résultats de l'exécution du code dans la console firebug:

alt text

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

Supprime tout sauf les caractères alphanumériques et les espaces, puis réduit plusieurs caractères adjacents en un seul espace.

Explication détaillée:

  1. \w est un chiffre, une lettre ou un trait de soulignement.
  2. \s est n'importe quel espace.
  3. [^\w\s] est tout ce qui n'est pas un chiffre, une lettre, un espace ou un trait de soulignement.
  4. [^\w\s]|_ est identique à # 3 sauf avec les soulignés rajoutés dans.
102
John Kugelman

Voici les caractères de ponctuation standard pour US-ASCII: !"#$%&'()*+,-./:;<=>?@[\]^_`{|}~

Pour les signes de ponctuation Unicode (tels que les guillemets bouclés, les tirets em, etc.), vous pouvez facilement faire correspondre des plages de blocs spécifiques. Le bloc Ponctuation générale est \u2000-\u206F et le bloc Ponctuation supplémentaire est \u2E00-\u2E7F.

Mis ensemble et correctement échappé, vous obtenez le RegExp suivant:

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

Cela devrait correspondre à peu près à toute ponctuation que vous rencontrez. Donc, pour répondre à la question initiale:

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"

Source US-ASCII: http://docs.Oracle.com/javase/7/docs/api/Java/util/regex/Pattern.html#posix

Source Unicode: http://kourge.net/projects/regexp-unicode-block

63
Joseph

/ [^ A-Za-z0-9\s]/g doit correspondre à toute la ponctuation mais conserver les espaces . Vous pouvez donc utiliser .replace(/\s{2,}/g, " ") pour remplacer les espaces supplémentaires si vous en avez besoin. Vous pouvez tester l'expression régulière dans http://rubular.com/

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

Update: Ne fonctionnera que si l'entrée est ANSI English.

10
adnan2nd

Je vais juste le mettre ici pour les autres.

Correspond à tous les caractères de ponctuation pour toutes les langues:

Construit à partir de la catégorie de ponctuation Unicode et ajouté des symboles de clavier courants tels que $ et les crochets et \-=_

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

remplacement de base:

".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"

ajouté\s comme espace

".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)

ajouté ^ pour inverser patternt pour correspondre non pas à la ponctuation mais aux mots eux-mêmes

".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)

pour un langage comme l'hébreu, peut-être supprimer "" les guillemets simple et double. et y réfléchir davantage.

en utilisant ce script:

étape 1: sélectionnez dans Firefox qui détient le contrôle une colonne de nombres U + 1234 et copiez-la, ne copiez pas U + 12456, ils remplacent l'anglais

étape 2 (je l’ai fait en chrome) trouver du texte et le coller dans celui-ci puis cliquer avec le bouton droit de la souris et cliquer sur inspecter. alors vous pouvez accéder à l'élément sélectionné avec $ 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("")

étape 3 copié sur les premières lettres l'ASCII sous forme de caractères séparés et non de plages, car quelqu'un pourrait ajouter ou supprimer des caractères individuels

8
Shimon Doodkin

J'ai rencontré le même problème, cette solution a fait l'affaire et était très lisible: 

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

Résultat: 

"This is an example of a string with punctuation"

L'astuce consistait à créer un ensemble négaté . Cela signifie que cela correspond à tout ce qui ne fait pas partie de l'ensemble, c'est-à-dire [^abc] - pas a, b ou c

\W est tout non-Word, donc [^\W]+ annulera tout ce qui n'est pas un Word char

En ajoutant dans le _ (trait de soulignement), vous pouvez aussi nier cela. 

Faites-le appliquer globalement /g, alors vous pouvez exécuter n'importe quelle chaîne et effacer la ponctuation: 

/[^_\W]+/g

Agréable et propre ;)

7
jacobedawson

Dans un langage compatible Unicode, la propriété Unicode Ponctuation character est \p{P} - que vous pouvez généralement abréger \pP et parfois étendre à \p{Punctuation} pour plus de lisibilité. 

Utilisez-vous une bibliothèque d’expressions régulières compatible Perl?

5
tchrist

Pour les chaînes en-US (anglais américain), cela devrait suffire:

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

Sachez que si vous supportez UTF-8 et des caractères tels que chinois/russe, etc., ils seront également remplacés. Vous devez donc spécifier ce que vous voulez.

5
meder omuraliev

Si vous souhaitez supprimer la ponctuation d'une chaîne, utilisez la classe Unicode P.

Mais, comme les classes ne sont pas acceptées dans le RegEx JavaScript, vous pouvez essayer ce RegEx qui doit correspondre à toute la ponctuation. Il correspond aux catégories suivantes: Pc Pd Pe Pf Pf Po Ps Sc Sk Sm So GénéralPunctuation SupplémentairePonctuation CJKSymbolsAndPunctuation CuneiformNumbersAndPunctuation.

Je l'ai créé à l'aide de cet outil en ligne qui génère des expressions régulières spécialement pour JavaScript . C'est le code pour atteindre votre objectif:

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)

4
Salvatore

si vous utilisez lodash

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

Cet exemple 

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

Si vous voulez ne conserver que les alphabets et les espaces, vous pouvez faire:

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

Cela dépend de ce que vous essayez de retourner. Je l'ai utilisé récemment:

return text.match(/[a-z]/i);
0
Amanda Koster