Ich möchte die Zielzeichenfolge "Soup base vegetarian no msg " analysieren ein Array von ["Soup", "base", "vegetarian", "no msg"] sein Analysieren Sie also grundsätzlich nach Leerzeichen, es sei denn, Leerzeichen folgen dem Wort "no" Ich habe es unten versucht und das Ergebnis war nicht genau richtig:

let test = "Soup base vegetarian no msg ";
console.log(test.split(/([^no]\s)/g));

Welchen regulären Ausdruck sollte ich verwenden, um dies zu erreichen?

3
WABBIT0111 18 Apr. 2018 im 21:09

3 Antworten

Beste Antwort

Sie können dieses match anstelle von split verwenden:

var str = "Soup base vegetarian no msg ";

var arr = str.match(/(?:\bno\s+)?\S+/g);

console.log(arr);
//=> ["Soup", "base", "vegetarian", "no msg"]

Regex (?:\bno\s+)?\S+ entspricht optional dem Wort no, gefolgt von 1+ Leerzeichen, bevor 1+ Nicht-Leerzeichen zugeordnet werden.

4
anubhava 18 Apr. 2018 im 18:12

Sie können diesen regulären Ausdruck ((no )?\w+) verwenden.

Erläuterung: -

  • (no )? stimmt entweder mit no überein (nein mit Leerzeichen oder nichts (?))
  • \w+ stimmt mit dem Wort überein (entspricht mehr als einem Alphabet (a-z oder A-Z))
var str = "Soup base vegetarian no msg";
var arr = str.match(/((no )?\w+)/g);
console.log(arr);
1
yajiv 18 Apr. 2018 im 18:24

Eine Lösung, die auf dieser Antwort unter Verwendung von Split basiert.

Der Code ist so seltsam, weil JS kein negatives Lookbehind unterstützt.

let test = "Soup base vegetarian no msg ";
var tokens = reverse(test)
  .split(/ (?!on)/g)
  .filter(x => x)
  .map(reverse);

console.log(tokens);

function reverse(s) {
  return s.split('').reverse().join('');
}
0
raul.vila 18 Apr. 2018 im 18:32