Как получить эффект [^\;]+ (производительность), но с последовательностью

Я хочу получить эффект [^\;]+, но используя исключенную последовательность. Если вы сравните эти два,

[^\;]+

.*?\;

строка: tatshdicndatsbba;

первый быстрее (особенно это заметно на больших строках). В этом преимущество. Первый делает все быстро, кроме ;, а второй прогрессивный, поэтому медленнее.

Если у нас есть это строка: tatshdi;cndatsbba;&djs

это первое регулярное выражение не работает. Я хотел бы знать, как я мог бы получить тот же эффект производительности с исключенной последовательностью вместо одного символа (;) Что-то вроде [^(\;\&)]+ (я знаю, что это исключает ; И &, но для пояснения допустим, что это новый изобретенный синтаксис)

Поэтому, когда он встречает ;, он должен проверить, следует ли за ним &. Если нет, сопоставьте его и продолжайте. Хитрость заключается в том, чтобы получить тот же эффект производительности, что и первое регулярное выражение, которое я указал.

Редактировать: Пример

строка: tatshdi;cndatsbba;&djcaca;sduf;aa

Ожидаемое совпадение: tatshdi;cndatsbba, &djcaca;sduf;aa

Поскольку за последними двумя ; не следует &, матч не останавливается и продолжается.

Хм... не могли бы вы показать пример нескольких исходных строк и желаемых результатов? Из вашего существующего объяснения до сих пор неясно, чего вы ожидаете от «придуманного» регулярного выражения.

RAllen 22.03.2024 04:00

Рекомендация: Regex — это не то, что вам нужно для производительности. Напишите программу для извлечения того, что вы хотите. Прирост производительности на 10-50% тут же.

Ted Lyngmo 22.03.2024 04:03

То, что вам нужно, может быть (?:(?!;&).)+

Hao Wu 22.03.2024 04:05

Я добавил пример строки и какие совпадения я ожидаю в вопросе

bobby324 22.03.2024 04:05

Почему бы не использовать .split? Пример: 'tatshdi;cndatsbba;&djcaca;sduf;aa'.split(/;(?=&)/) возвращает ["tatshdi;cndatsbba","&djcaca;sduf;aa"] и это быстро.

Peter Thoeny 22.03.2024 04:09

@HaoWu это слишком медленно по сравнению с .*?\;

bobby324 22.03.2024 04:36

Все регулярное выражение работает медленно (на сегодняшний день). Я превосходил каждое регулярное выражение в 10-1000000 раз, когда его бросали вызов. Это не инструмент для повышения производительности.

Ted Lyngmo 22.03.2024 04:49

@TedLyngmo Поле является регулярным выражением. Снаружи? не интересно.

bobby324 22.03.2024 04:53

@bobby324 Какую большую реальную проблему ты пытаешься решить?

Ted Lyngmo 22.03.2024 04:55

Это близко к старому xyproblem.info

Ted Lyngmo 22.03.2024 04:56

Ваш вопрос предполагает, что приоритетом является самое быстрое решение. Почему это должно быть регулярное выражение? Это больше похоже на головоломку, чем на практическую задачу программирования.

Barmar 22.03.2024 05:25

Опять же, областью проблемы является регулярное выражение. Я попросил ответ с регулярным выражением. Не головоломка. Вопрос есть способ или нет?

bobby324 22.03.2024 05:29

В регулярном выражении JavaScript невозможно сопоставить только любую строку любой длины, кроме определенной последовательности символов. Вы можете создать такой шаблон, только сопоставляя то, что вам не нужно, но сопоставляя и фиксируя то, что вам нужно. В противном случае - и это рекомендуется - используйте обходные пути или - как все здесь упоминают - код. Я также понимаю, что слово «выполнить[окончание]» используется здесь в значении «работа», регулярное выражение должно давать тот же результат, что и при его использовании с одним отрицательным символом.

Wiktor Stribiżew 22.03.2024 08:52

Вы можете «перепрыгивать» от точки с запятой к точке с запятой, используя повторяющуюся группу, например: [^;]+(?:;[^;&][^;]*)* или что-то более гибкое, используя просмотр вперед: [^;]+(?:;(?!&)[^;]+)*

Casimir et Hippolyte 22.03.2024 15:00
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
0
14
79
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Я не знаю, как вы измеряете производительность, поэтому давайте воспользуемся https://regex101.com (вкус PCRE2).

Для строки tatshdicndatsbba;:

  • регулярное выражение [^\;]+ выдает 1 совпадение за 3 шага
  • reges .*?\; выдает 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]); }

Спасибо. Я немного изменил его (?:&?\;?[^\;\&]+)+, чтобы он был более адаптируемым.

bobby324 18.04.2024 16:32

У него практически такая же скорость (или чуть быстрее), что и у /.*?;&/, к сожалению.

bobby324 18.04.2024 16:40

Другие вопросы по теме

Сопоставить именованную группу регулярных выражений до необязательного слова
Веб-сайты Веб-скрапинг электронных писем с использованием Python
Анализировать строку по запятой, но игнорировать запятые в кавычках и скобках
Извлечение шаблона в строку в pyspark с использованием регулярного выражения
RegEx не проверен должным образом в производственной сборке, не принимает 0, 2, 7, a, c, u, x, иногда также z
Pandas: заменить регулярное выражение строкой, заканчивающейся табуляцией, не работает
Регулярное выражение для строки, которая не начинается ни с одного символа группы и не содержит ни одной из нескольких подстрок
Можете ли вы заменить подстроку из совпадения с регулярным выражением?
Почему JavaScript возвращает разные результаты для метода RegExp test() с пустым объектом?
Результат регулярного выражения содержит дополнительное совпадение/группу только с возвратом