Я хочу получить эффект [^\;]+, но используя исключенную последовательность.
Если вы сравните эти два,
[^\;]+
.*?\;
строка: tatshdicndatsbba;
первый быстрее (особенно это заметно на больших строках). В этом преимущество. Первый делает все быстро, кроме ;, а второй прогрессивный, поэтому медленнее.
Если у нас есть это
строка: tatshdi;cndatsbba;&djs
это первое регулярное выражение не работает.
Я хотел бы знать, как я мог бы получить тот же эффект производительности с исключенной последовательностью вместо одного символа (;)
Что-то вроде [^(\;\&)]+ (я знаю, что это исключает ; И &, но для пояснения допустим, что это новый изобретенный синтаксис)
Поэтому, когда он встречает ;, он должен проверить, следует ли за ним &. Если нет, сопоставьте его и продолжайте. Хитрость заключается в том, чтобы получить тот же эффект производительности, что и первое регулярное выражение, которое я указал.
Редактировать: Пример
строка: tatshdi;cndatsbba;&djcaca;sduf;aa
Ожидаемое совпадение: tatshdi;cndatsbba, &djcaca;sduf;aa
Поскольку за последними двумя ; не следует &, матч не останавливается и продолжается.
Рекомендация: Regex — это не то, что вам нужно для производительности. Напишите программу для извлечения того, что вы хотите. Прирост производительности на 10-50% тут же.
То, что вам нужно, может быть (?:(?!;&).)+
Я добавил пример строки и какие совпадения я ожидаю в вопросе
Почему бы не использовать .split? Пример: 'tatshdi;cndatsbba;&djcaca;sduf;aa'.split(/;(?=&)/) возвращает ["tatshdi;cndatsbba","&djcaca;sduf;aa"] и это быстро.
@HaoWu это слишком медленно по сравнению с .*?\;
Все регулярное выражение работает медленно (на сегодняшний день). Я превосходил каждое регулярное выражение в 10-1000000 раз, когда его бросали вызов. Это не инструмент для повышения производительности.
@TedLyngmo Поле является регулярным выражением. Снаружи? не интересно.
@bobby324 Какую большую реальную проблему ты пытаешься решить?
Это близко к старому xyproblem.info
Ваш вопрос предполагает, что приоритетом является самое быстрое решение. Почему это должно быть регулярное выражение? Это больше похоже на головоломку, чем на практическую задачу программирования.
Опять же, областью проблемы является регулярное выражение. Я попросил ответ с регулярным выражением. Не головоломка. Вопрос есть способ или нет?
В регулярном выражении JavaScript невозможно сопоставить только любую строку любой длины, кроме определенной последовательности символов. Вы можете создать такой шаблон, только сопоставляя то, что вам не нужно, но сопоставляя и фиксируя то, что вам нужно. В противном случае - и это рекомендуется - используйте обходные пути или - как все здесь упоминают - код. Я также понимаю, что слово «выполнить[окончание]» используется здесь в значении «работа», регулярное выражение должно давать тот же результат, что и при его использовании с одним отрицательным символом.
Вы можете «перепрыгивать» от точки с запятой к точке с запятой, используя повторяющуюся группу, например: [^;]+(?:;[^;&][^;]*)* или что-то более гибкое, используя просмотр вперед: [^;]+(?:;(?!&)[^;]+)*



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


Я не знаю, как вы измеряете производительность, поэтому давайте воспользуемся https://regex101.com (вкус PCRE2).
Для строки tatshdicndatsbba;:
[^\;]+ выдает 1 совпадение за 3 шага.*?\; выдает 1 совпадение за 19 шаговИтак, это соответствует вашему результату.
Затем для строки tatshdi;cndatsbba;&djcaca;sduf;aa
[^\;]+ выдает 5 совпадений за 14 шагов (неверно).*?\; выдает 4 совпадения за 39 шагов (неверно)Правильное регулярное выражение, которое дает ровно 2 совпадения:
&?(?:;?[^;&]+)+ — 2 совпадения за 29 шаговlet s = "tatshdi;cndatsbba;&djcaca;sduf;aa";
for (let m of s.matchAll(/&?(?:;?[^;&]+)+/g)) { console.info(m[0]); }Еще одна строка с тремя совпадениями:
let s = "tatshdi;cndatsbba;&djcaca;sduf;aa;&djcaca;sd";
for (let m of s.matchAll(/&?(?:;?[^;&]+)+/g)) { console.info(m[0]); }Спасибо. Я немного изменил его (?:&?\;?[^\;\&]+)+, чтобы он был более адаптируемым.
У него практически такая же скорость (или чуть быстрее), что и у /.*?;&/, к сожалению.
Хм... не могли бы вы показать пример нескольких исходных строк и желаемых результатов? Из вашего существующего объяснения до сих пор неясно, чего вы ожидаете от «придуманного» регулярного выражения.