2012-06-14 4 views
2

Я довольно новый с регулярным выражением.Regex соответствует шаблону и исключает список строк

В основном я пытаюсь создать регулярное выражение для оценки пути URL из нашей системы. Однако, есть известная ошибка в нашей системе, которая вызывая URL путь стать действительно грязный ..

В идеале, URL должен быть

/mobile/retail.* 

Из-за ошибки, то URL будет «что-то другое» в между «/ мобильным» и «/ розничной» что-то вроде этого

/mobile(/.*)?/retail

но непростые немного, когда есть некоторые слова, которые я хотел бы игнорировать в этом «что-то другое», то есть продажу, поиск , лот, логин. Таким образом, дело должно выглядеть следующим образом

Так у меня есть тестовый пример, как это:

  • /мобильный/розничной торговли -> матч
  • /мобильный/розничное/что-то -> матч
  • /мобильный/что-то/розничное/что-то -> матч
  • /мобильный/что-то/розничное/что-то/продажа -> матч
  • /мобильный/что-то/что-то/розничное/что-то/продажа -> матч
  • /мобил/продажа/что-то -> Dont матч
  • /мобильный/что-то/продажа/что-то -> Dont матч
  • /мобильный/что-то/продажа/что-то/розничное -> Dont матч
  • /мобильный/серия/тест/розничное -> Dont матч
  • /мобильный/тест/серия/тест/розничное -> Dont матч
  • /мобильный/путь/test2/test3/testx/серия/тест/розничное -> Dont матч

Я немного застрял в этом регулярном выражении, и он не работает так, как я этого хочу.

/mobile(/(?!sale|search|lot|login).*)?/retail.* 

Регулярное выражение выше не работает в условиях такой:

  • /мобильный/что-то/продажа/то/розничной
  • /мобильный/тест/серия/тест/розничное
  • /mobile/path/test2/test3/testx/lot/test/retail

Слово исключить строго.Например, список ниже должен пройти:

  • /мобильный/участок/розничное
  • /мобильные/много/розничные
  • /мобильные/много-оф-продажи/розничной
  • /мобильный/продажи -item/розничное/что-то/тест/продажа
  • /мобильный/поиск-PRG-вещь-тест/тест/розничное

любой человек с хорошим знанием регулярных выражений и любой обратной связи очень ценится.

ответ

6

Сначала попробуйте это:

/mobile(?:/(?:(?!sale|search|lot|login)[^/])++)*/retail.* 

Если это не удается скомпилировать (вы не указали свои регулярки вкуса), попробуйте

/mobile(?:/(?:(?!sale|search|lot|login)[^/])+)*/retail.* 

Объяснение:

/mobile      # Match "/mobile" 
(?:       # Match... 
/      # a slash 
(?:      # followed by... 
    (?!sale|search|lot|login) # (only if these strings arent't present 
    [^/]      # any character except slashes 
)++      # Match at least one and don't backtrack 
)*       # Do this zero or more times 
/retail      # Then match "/retail" 
.*       # plus whatever follows 
2

Регулярное регулярное выражение, которое соответствует частям между слэшами, где такая часть может не быть продажа, поиск, много или Логин:

^/mobile(/(?!sale|search|lot|login)[^/]*)*/retail.* 
+0

Я думаю, что это лучше, чем у меня, так как это позволило бы пути, как '/ мобильный/участок/retail' проход (который шахта отторгнут). Разумеется, вы также откажетесь от '/ mobile/lots/retail'. @Wilson не совсем определил, насколько строго эти «плохие слова» нужно интерпретировать. –

+0

Привет Тим, он специфичен только для/lot/или/sale /, например, я ожидаю/мобильный/сюжет/розничная и/mobile/lots/retail. Другой пример. Если это/mobile/saleitem/retail, он должен пройти тоже. Если это имеет смысл – Wilson

+0

Я нашел это регулярное выражение: /mobile(?!(.*)(/sale/|/search/|/lot/|/login/).*/retail).*/retail.* и выглядит это работает! :) – Wilson

Смежные вопросы