#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/12. Вы можете использовать
.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 сказал, что он не возражает против проблем с интервалами, но я добавлю обрезку