Comment puis-je supprimer toute ponctuation d'une chaîne en JavaScript en utilisant regex?
si j'ai une chaîne avec n'importe quel type de caractère non alphanumérique:
"This., -/ is #! an $ % ^ & * example ;: {} of a = -_ string with `~)() punctuation"
comment en obtenir une version sans ponctuation en JavaScript:
"This is an example of a string with punctuation"
13 réponses
si vous voulez supprimer la ponctuation spécifique d'une chaîne, il sera probablement préférable de supprimer explicitement exactement ce que vous voulez comme
replace(/[.,\/#!$%\^&\*;:{}=\-_`~()]/g,"")
faire ce qui précède ne renvoie toujours pas la chaîne telle que vous l'avez spécifiée. Si vous voulez supprimer tous les espaces supplémentaires qui ont été laissés de supprimer ponctuation folle, alors vous allez vouloir 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 du code de fonctionnement dans la console firebug:
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 à des espaces simples.
explication détaillée:
-
\w
est un chiffre, une lettre ou un trait de soulignement. -
\s
est n'importe quel espace. -
[^\w\s]
est tout ce qui n'est pas un chiffre, une lettre, un espace ou un trait de soulignement. -
[^\w\s]|_
est le même que #3 sauf avec les underscores ajoutés à nouveau.
Voici les caractères de ponctuation standard pour US-ASCII: !"#$%&'()*+,-./:;<=>?@[\]^_`{|}~
pour la ponctuation Unicode (comme les guillemets bouclés, em-dashes, etc.), vous pouvez facilement faire correspondre sur les 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\'!"#$%&()*+,\-.\/:;<=>?@\[\]^_`{|}~]/
qui devrait correspondre à peu près à toute Ponctuation que vous rencontrez. Donc, pour répondre à la question originale:
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 source: http://docs.oracle.com/javase/7/docs/api/java/util/regex/Pattern.html#posix
Unicode source: http://kourge.net/projects/regexp-unicode-block
/[^A-Za-z0-9\S] / g devrait correspondre à toute la ponctuation, mais garder les espaces.
Ainsi, vous pouvez utiliser .replace(/\s{2,}/g, " ")
pour remplacer les espaces supplémentaires si vous avez besoin de le faire. Vous pouvez tester le regex dans http://rubular.com /
.replace(/[^A-Za-z0-9\s]/g,"").replace(/\s{2,}/g, " ")
mise à Jour : ne fonctionne que si l'entrée est ANSI anglais.
je vais le mettre ici pour les autres.
correspondent à toutes les ponctuations pour toutes les langues:
Construit à partir de la catégorie de ponctuation Unicode et ajouté quelques symboles communs de clavier comme $
et les crochets et \-=_
http://www.fileformat.info/info/unicode/category/Po/list.htm
remplacer:
".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 pas ponctuation, mais les 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 une langue comme l'Hébreu peut-être pour supprimer "' la simple et la double citation. et ne plus penser à elle.
utilisant ce script:
étape 1: Sélectionnez dans Firefox holding control une colonne de numéros U+1234 et copiez-la, ne copiez pas U+12456 ils remplacent l'anglais
étape 2 (Je l'ai fait dans chrome)trouver un peu de textarea et le coller dans elle puis rightclick et cliquez sur Inspecter. ensuite, vous pouvez accéder à l'élément sélectionné avec 0$.
var x="151930920".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 les caractères ascii comme caractères séparés ne varie pas parce que quelqu'un pourrait ajouter ou supprimer des caractères individuels
j'ai couru à travers la même question, 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"
le truc était de créer un jeu nié . Cela signifie qu'il correspond à tout ce qui n'est pas dans l'ensemble i.e. [^abc]
- pas a, b ou c
\W
est un non-mot, donc [^\W]+
va nier tout ce qui n'est pas un mot char .
en ajoutant le _ (underscore) vous pouvez nier cela aussi.
faire appliquer globalement /g
, alors vous pouvez exécuter n'importe quelle chaîne et effacer la ponctuation:
/[^_\W]+/g
Agréable et propre ;)
Pour en-US ( anglais Américain ) les chaînes de caractères, cela devrait suffire:
"This., -/ is #! an $ % ^ & * example ;: {} of a = -_ string with `~)() punctuation".replace( /[^a-zA-Z ]/g, '').replace( /\s\s+/g, ' ' )
soyez conscient que si vous supportez UTF-8 et des caractères comme le chinois/russe et tout, cela les remplacera aussi, donc vous devez vraiment spécifier ce que vous voulez.
dans un langage Unicode-aware, le Unicode Ponctuation propriété de caractère est \p{P}
- que vous pouvez généralement abrévier \pP
et parfois étendre à \p{Punctuation}
pour la lisibilité.
utilisez-vous une bibliothèque D'expressions régulières compatible Perl?
selon liste de ponctuations de Wikipedia j'ai dû construire le regex suivant qui détecte les ponctuations :
[\.’'\[\](){}⟨⟩:,،、‒–—―…!.‹›«»‐\-?‘’“”'";/⁄·\&*@\•^†‡°”¡¿※#№÷׺ª%‰+−=‱¶′″‴§~_|‖¦©℗®℠™¤₳฿₵¢₡₢$₫₯֏₠€ƒ₣₲₴₭₺₾ℳ₥₦₧₱₰£៛₽₹₨₪৳₸₮₩¥]
si vous voulez supprimer la ponctuation d'une chaîne de caractères, vous devez utiliser la classe P
Unicode.
mais, parce que les classes ne sont pas acceptées dans le JavaScript RegEx, vous pouvez essayer ce RegEx qui devrait correspondre à toute la ponctuation. Il correspond aux catégories suivantes: Pc Pd Pe Pf PF Po Ps Sc Sk Sm So Fonctionnationgénérale Fonctionnation supplementaire CJKSymbolsAndPunctuation CuneiformNumbersAndPunctuation.
Je l'ai créé en utilisant cet outil en ligne qui génère des Expressions régulières spécifiquement 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, '');
console.log(newString)
si vous voulez ne conserver que des alphabets et des espaces, vous pouvez faire:
str.replace(/[^a-zA-Z ]+/g, '').replace('/ {2,}/',' ')
si vous utilisez lodash
_.words('This, is : my - test,line:').join(' ')
Cet Exemple
_.words('"This., -/ is #! an $ % ^ & * example ;: {} of a = -_ string with `~)() punctuation"').join(' ')
Cela dépend de ce que vous essayez de revenir. J'ai utilisé ceci récemment:
return text.match(/[a-z]/i);