Используя регулярное выражение JavaScript, чтобы найти первое И самое длинное соответствие - PullRequest
5 голосов
/ 21 января 2010

У меня есть RegExp, как в следующем упрощенном примере:

var exp = /he|hell/;

Когда я запускаю строку, она дает мне первое совпадение, fx:

var str = "hello world";
var match = exp.exec(str);
// match contains ["he"];

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

Поскольку выражение объединено из массива RegExp, я ищу способ найти самое длинное совпадение без необходимости переписывать регулярное выражение.

Это вообще возможно?

Если это не так, я ищу способ легко проанализировать выражение и расположить его в правильном порядке. Но я не могу понять, как выражения могут быть намного сложнее, fx:

var exp = /h..|hel*/

Ответы [ 5 ]

4 голосов
/ 21 января 2010

Как насчет /hell|he/?

3 голосов
/ 20 ноября 2012

Вы можете сделать это. Это объясняется здесь: http://www.regular -expressions.info / alternation.html

(В итоге измените порядок или группу операндов со знаком вопроса во второй части поиска.)

2 голосов
/ 21 января 2010

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

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

1 голос
/ 21 января 2010

Вы не можете "самое длинное совпадение" (или что-либо, включающее подсчет, минус упреждения) с регулярными выражениями.

Лучше всего найти всех совпадений и просто сравнить длины в программе.

0 голосов
/ 05 июля 2017

Не знаю, ищите ли вы это (учитывая, что этому вопросу уже почти 8 лет ...), но вот мое зерно соли:

(переключение he for hell выполнит поиск по величине сначала)

var exp = /hell|he/;
var str = "hello world";
var match = exp.exec(str);

if(match)
{
  match.sort(function(a, b){return b.length - a.length;});            
  console.log(match[0]);
 }

Где match [0] будет самой длинной из всех совпадающих строк.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...