2016-04-09 4 views
1

У меня есть URL, как этот domain.com/news-343dds-this-is-testRegex Extract ID Из URL

Я хочу, чтобы извлечь новости идентификатор 343dds, поэтому я попытался использовать регулярное выражение

Вот регулярное выражение я использовал /news-(.+)-/

Но результат такой вот 343dds-this-is. Я хочу получить только 343dds.

ответ

6

(.+) жадность и соответствие остальной части ввода. Измените его на (.+?), чтобы сделать его не жадным.

1

Решение Джереми Хэнлон очевидно работает, но не является наиболее рекомендуемым.

Вам лучше использовать ([^-]+).

Даже если это, вероятно, не имеет значения в простых случаях, таких как этот вопрос SO, у ленивого квантора +? есть неудобство в том, что количество шагов пропорционально размеру искомой части, что может сильно повлиять на производительность.
Это ясно объясняется here.

Пример:

  • (.+?)needs 22 steps для данного 343dds ключа
  • (.+?)needs 68 steps для более длинного ключа, как thisIsASignificativelyLongKey
  • ([^-]+)needs 12 steps только для любого ключа
+0

Ya это хороший ответ , Но как рассчитываются этапы? – mkHun

+1

@mkHun Длительный ответ дается ссылкой «здесь» выше. Короткий (с '(. +?)'): 1) движок обнаружил, что 1-й символ после «новостей-» соответствует '. +', Но второй не соответствует '-' (это один шаг); 2), то он возвращается, обнаруживает, что 1-й и 2-й символы соответствуют '. +', Но третий не соответствует '-' (это один шаг); 3), затем он возвращается ... и так далее, пока не будет найдено совпадение с 1-го по n-го символа '. +' И n + 1-е совпадение '-'. Таким образом, для этого требуется столько шагов, сколько размер искомой строки! – cFreed