Разделить строку любым из заданных разделителей

#javascript

#javascript

Вопрос:

У меня эти уродливые предложения разделены || .

 const a = "they *have* a* car* sold. ||They* eat* the * good * stuff";
  

Как я могу разделить данную строку знаками * или || , чтобы мы получили этот результат:

 ['they', 'have','a', 'car', 'sold', 'they', 'eat', 'the ', 'good ', 'stuff'];
  

Я не возражаю против проблем с интервалами, я хочу разделить по той или иной функциональности.

Примечание: мы можем достичь этого просто с помощью map но мне интересно, есть ли решение с помощью регулярного выражения или чего-то еще!

Комментарии:

1. Похоже, вам просто нужны w символы ord: regex101.com/r/9HWuH2/1

2. Вы можете использовать .split(/W /)

Ответ №1:

Чтобы сделать ее более общей, вы можете

  • .split() одним или несколькими последовательными ( квантификатором) неалфавитными символами ( /[^a-z]/ ),
  • примените .filter(Boolean) , чтобы избавиться от пустых строк в результирующем массиве (которые могут появиться при определенных обстоятельствах)
  • используйте Array.prototype.map() для применения нижнего регистра к каждому слову ( String.prototype.toLowerCase() )

 const src = "they *have* a* car* sold. ||They* eat* the * good * stuff",

      result = src
        .split(/[^a-z] /i)
        .filter(Boolean)
        .map(w => w.toLowerCase())
      
console.log(result)  

Комментарии:

1. Я думаю, что если вы используете, /[^a-z] /i вы могли бы удалить дополнительную filter(Boolean) итерацию 😉

2. @NickParsons : тогда результат .split() будет содержать пустые строки

3. Я получаю, ["they","have","a","car","sold","They","eat","the","good","stuff"] если я разделю ее с помощью /[^a-z] /i , поэтому пустых строк нет, но я думаю, вы получили бы пустую строку, если бы не алфавитный символ был в начале или в конце строки, делая это таким образом

Ответ №2:

Вы могли бы использовать String.prototype.match(), который вернет вам массив совпадений, найденных в строке для данного регулярного выражения.

 const a = "they *have* a* car* sold. ||They* eat* the * good * stuff";

console.log(a.match(/w /g));  

Ответ №3:

 let a = "they *have* a* car* sold. ||They* eat* the * good * stuff";

a = a.replace(/[^a-zA-Z ]/g, "")
a = a.split(' ')

  

Ответ №4:

 const a = "they *have* a* car* sold. ||They* eat* the * good * stuff";
let arr = a.split(/*|||/);
console.log(...arr);  

Комментарии:

1. Элементы arr содержат точки и пробелы в отличие от ожидаемого результата

Ответ №5:

Вот решение без регулярных выражений, если вы хотите их избежать

 const a = "they *have* a* car* sold. ||They* eat* the * good * stuff";

function multisplit(input, ...splits) {
  input = [input]
  while (splits.length) {
    let splitter = splits.shift()
    input = input.flatMap(sub => sub.split(splitter))
  }
  return input.map(el => el.trim())
}

console.log(multisplit(a, "*", "||"))  

Комментарии:

1. Выходные данные содержат дополнительные пробелы и точки в отличие от ожидаемых выходных данных.

2. @Evgengorbunkov op сказал, что он не возражает против проблем с интервалами, но я добавлю обрезку