2016-10-27 2 views
4

Ich muss eine Zeichenfolge in ein Array basierend auf einer Anzahl von Zeichen und ohne ein Wort abzutrennen.Teilen einer Zeichenfolge mit Regex basierend auf der Anzahl der Zeichen und Leerzeichen

Ich habe das schon mit:

var charPerLine = 17; 
var regex = new RegExp('^(.{'+charPerLine+'}\\S*\\s+', 'g'); 
var output = str.replace(regex, "$&@").split(/\[email protected]/); 

Das Problem mit diesem Code ist, dass manchmal bekomme ich einen String länger als 17 Zeichen, im Fall der Raum auf die neuesten Zeichen der Nähe war.

Zum Beispiel

var str = "I want you to do something else instead."; 

Ruft aufgeteilt in:

var output = ["I want you to do something", "else instead."] 

Aber der erste String mehr als 17 Zeichen, ich brauche es aufgeteilt werden wie zum Beispiel:

var output = ["I want you to do", "something else", "instead."] 

Es muss auch mit Satzzeichen und einfachen/doppelten Anführungszeichen arbeiten

Irgendwelche Vorschläge?

+0

Frage: Was ist ein einziges Wort passiert, wenn mehr als 15 Zeichen hat? Wird es irgendwo gespalten, oder essen wir es? –

+1

Das sollte nie passieren, also würde ich sagen, es sollte nicht in der Mitte abgeschnitten werden – alexmngn

Antwort

1

Sie eine Wort-Grenze Behauptung \b zum ersten regulären Ausdruck hinzufügen kann, so dass es nicht mit \S* voranbringen wird, wenn es zur Zeit zu Beginn eines neuen Wortes ist:

var str = "I want you to do something else instead"; 
 

 
var charPerLine = 15; 
 
var regex = new RegExp('.{'+charPerLine+'}(?:\\b|\\S*\\s+)', 'g'); 
 
var output = str.replace(regex, "$&@").split(/\s*@\s*/); 
 

 
console.log(output);

+0

Du machst wirklich gute Arbeit hier, weiter so +1 –

+0

@TimBiegeleisen Danke, ich schätze es wirklich. Es fühlt sich gut an im "k" s Club zu sein (habe es gerade bekommen);) – 4castle

+0

Erwarten Sie keine Limousinenfahrt mit Jon Skeet, aber ja, es ist eine große Leistung :-) –

4
(?=(\b.{1,17}\b))\1 

Sie können dies verwenden und ersetzen durch $1\n. Siehe Demo.

https://regex101.com/r/ff7iZp/1

+0

Das hat ein etwas anderes Verhalten zw. Es findet die * letzte * mögliche Unterbrechungsmöglichkeit * innerhalb von * 17 Zeichen, während die OP-Regex die * erste * mögliche Unterbrechungsmöglichkeit * nach * 17 Zeichen findet. Dies kann jedoch wünschenswert sein. – 4castle

+0

Dies funktioniert nicht gut mit Interpunktion und Anführungszeichen. – alexmngn

+0

@alexmngn kann Ihnen ein Beispiel geben – vks

Verwandte Themen