Hoe kan ik alle interpunctie uit een tekenreeks in JavaScript verwijderen met regex?

Als ik een string heb met een willekeurig type niet-alfanumeriek teken erin:

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

Hoe krijg ik een versie zonder interpunctie in JavaScript:

"This is an example of a string with punctuation"

Antwoord 1, autoriteit 100%

Als je specifieke interpunctie uit een tekenreeks wilt verwijderen, is het waarschijnlijk het beste om expliciet te verwijderen wat je wilt, zoals

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

Als u het bovenstaande doet, wordt de tekenreeks nog steeds niet geretourneerd zoals u deze hebt opgegeven. Als je extra spaties wilt verwijderen die zijn overgebleven na het verwijderen van gekke interpunctie, dan wil je zoiets doen als

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

Mijn volledige voorbeeld:

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

Resultaten van het uitvoeren van code in de Firebug-console:

alt-tekst


Antwoord 2, autoriteit 68%

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

Verwijdert alles behalve alfanumerieke tekens en witruimte, en vouwt vervolgens meerdere aangrenzende witruimten samen tot enkele spaties.

Gedetailleerde uitleg:

  1. \wis een willekeurig cijfer, letter of onderstrepingsteken.
  2. \sis een willekeurige spatie.
  3. [^\w\s]is alles dat geen cijfer, letter, spatie of onderstrepingsteken is.
  4. [^\w\s]|_is hetzelfde als #3, behalve dat de underscores weer zijn toegevoegd.

Antwoord 3, autoriteit 32%

Dit zijn de standaard leestekens voor US-ASCII: !"#$%&'()*+,-./:;<=>?@[\]^_`{|}~

Voor Unicode-interpunctie (zoals gekrulde aanhalingstekens, em-streepjes, enz.), kunt u eenvoudig overeenkomen met specifieke blokbereiken. Het blok Algemene interpunctieis \u2000-\u206Fen het blok Aanvullende interpunctieis \u2E00-\u2E7F.

Samengevoegd en correct escaped, krijg je de volgende RegExp:

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

Dat moet overeenkomen met vrijwel alle leestekens die je tegenkomt. Dus, om de oorspronkelijke vraag te beantwoorden:

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-bron: http://docs. oracle.com/javase/7/docs/api/java/util/regex/Pattern.html#posix

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

Other episodes