Регулярное выражение Javascript: как избежать катастрофического возврата в этом случае

#javascript #regex

#javascript #регулярное выражение

Вопрос:

Я хочу сопоставить строку like [[[[145.139038,-37.933533],[145.084]]]] .

Итак, у меня есть следующее регулярное выражение: ^[{2,}(d|-|.|[|]|) ]{2,}$ , которое работает нормально. Но проблема возникает, когда у меня есть дополнительный символ в конце строки.

Например [[[[145.139038,-37.933533],[145.084]]]]} , в этом случае. Затем он взрывается.

Кто-нибудь может мне помочь с этим?

Комментарии:

1. Большое спасибо за ваш ответ. Оно не соответствовало более крупной строке. Вот пример: regex101.com/r/5QOihq/3

2. Что такое символ в вашем вводе?

3. Opss my bad добавлен туда по ошибке. Спасибо, это сработало 🙂

Ответ №1:

Ваше регулярное выражение кажется неправильным, поскольку у вас пустое чередование. Многие односимвольные чередования могут быть выражены в классе символов [...] .

Это регулярное выражение должно работать для ваших входных данных:

 /^[{2,}([-d.[],s] )]{2,}$/g
  

Демонстрация регулярных выражений

Ответ №2:

Все зависит от того, чего вы хотите.

Проще всего удалить $ в самом конце, так как оно соответствует концу строки. Регулярное выражение будет: ^[{2,}(d|-|.|[|]|) ]{2,} См.: https://regex101.com/r/5QOihq/1

Если вы хотите точно соответствовать вашей строке и разрешить как можно больше других символов после этого до конца строки, вы можете выбрать: ^([{2,}(d|-|.|[|]|) ]{2,}).*$
https://regex101.com/r/5QOihq/2


Обновлено после комментария с дополнительными примерами: [((?:[ -]?)d .[d…] ,s(?:[ -]?)d .[d…] (?:,sd .[d…] )?)]
https://regex101.com/r/5QOihq/6

Комментарии:

1. Большое вам спасибо за столь быстрый ответ. Но это не сработало для больших строк: ( regex101.com/r/5QOihq/5

2. Обновил ваш пример: regex101.com/r/5QOihq/6

Ответ №3:

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

  ^ 
 [{2,} 
 (                  # (1 start)
    d 
  | -
  | .                  # <- dot matches d,-,[,]
  | [ 
  | ] 
    # | <- do not allow nothing really
 )                  # (1 end)
 ]{2,} 
 $