Например, получите строку abaacaaa, символ a, разделите строку, чтобы получить ['ab', 'aac', 'aaa'].
string = 'abaacaaa'
string.split('a') // 1. ["", "b", "", "c", "", "", ""]
string.split(/(?=a)/) // 2. ["ab", "a", "ac", "a", "a", "a"]
string.split(/(?=a+)/) // 3. ["ab", "a", "ac", "a", "a", "a"]
string.split(/*???*/) // 4. ['ab', 'aac', 'aaa']
Почему выражение 3-й выводит то же значение, что и 2-й, даже если + представлен после a, и что помещать в 4-й?
Редактировать:
string.match(/a+[^a]*/g) не работает должным образом в babaacaaa.
string = 'babaacaaa' // should be splited to ['b', 'ab', 'aac', 'aaa']
string.match(/a+[^a]*/g) // ["ab", "aac", "aaa"]
Я хочу повернуть струну как можно более лаксикографически. Например, с abaca на aabac
Незакрепленные опережающие просмотры проверяют каждую позицию во входной строке. Следовательно, 2 = 3. Кроме того, 'abaacaaa'.match(/a+[^a]*/g), похоже, работает как 4).
В python вы также можете использовать поиск назад, чтобы найти позицию, которую вы запрашивали для выполнения операции разделения (например, ^|(?<=[^a])(?=a+(?:[^a]|$)), но, к сожалению, в настоящее время поиск назад не поддерживается javascript. Проверьте: regex101.com/r/qDrobh/2



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


let string = 'abaacaaa'
let result = string.match(/a*([^a]+|a)/g)
console.info(result)
string = 'babaacaaa'
result = string.match(/a*([^a]+|a)/g)
console.info(result)Решения 2 и 3 равны, потому что незакрепленные опережающие просмотры проверяют каждую позицию во входных данных. нить. (?=a) проверяет начало строки в abaacaaa и находит совпадение, первый пустой результат отбрасывается. Затем он пытается найти a, совпадений нет, поскольку символ справа - это b, механизм регулярных выражений переходит на следующую позицию. Далее он соответствует после b. ab добавлен к результату. Затем он сопоставляет позицию после a, добавляет a в результирующий массив и переходит к следующей позиции, чтобы найти совпадение. И так далее. С (?=a+) процесс неопределенный, он просто сопоставляет 1+ a, но все же проверяет каждую позицию.
Чтобы разделить babaacaaa, вам понадобится
var s = 'babaacaaa';
console.info(
s.split(/(a+[^a]*)/).filter(Boolean)
);Соответствует a+[^a]*
a+ - 1 или более a[^a]* - 0 или более символов, кроме aГруппа захвата позволяет добавлять совпавшие подстроки в результирующий массив split, а .filter(Boolean) отбрасывает пустые совпадения между соседними совпадениями.
string.match(/^[^a]+|a+[^a]*/g) вроде работает как положено.
В каком контексте вы ожидаете, что строка будет разделена?