2013-05-23 4 views
4

I have a code which экстракт строки запроса параметры:Разделить по доходности регулярных выражений "неопределенном"

Так (например), если окно является URL:

....&a=1&.....

--The код первым использованием split на & и затем разделите на =

Однако иногда мы используем значения base64, которые могут иметь дополнительные финалы ='s (padding).

And here is where my code is messed up.

результат N4JOJ7yZTi5urACYrKW5QQ и он должен быть N4JOJ7yZTi5urACYrKW5QQ==

Я расширяю свои регулярное выражение:

поиск= таким образом, что после он -> (there is no endИЛИthere is no [=])

'a=N4JOJ7yZTi5urACYrKW5QQ=='.split(/\=(?!($|=))/)

это работает. (вы можете запустить его на консоли)

но результат ["a", undefined, "N4JOJ7yZTi5urACYrKW5QQ=="]

  • Почему я получаю неопределенный
  • Как я могу вылечить мое регулярное выражение для уступая лишь ["a", "N4JOJ7yZTi5urACYrKW5QQ=="]

ps Я знаю, что могу заменить все финалы = на что-то временное, а затем заменить его обратно , но этот тег помечен как регулярное выражение. Так что я ищу способ исправить свое регулярное выражение.

+0

Вы также можете использовать '.filter (function (n) {return n;})' для удаления пустых совпадений. –

ответ

5

Это случается, потому что у вас есть дополнительное совпадение ($|=).Вы можете исключить его из сопоставления с ?::

"a=N4JOJ7yZTi5urACYrKW5QQ==".split(/=(?!(?:$|=))/); 

Однако вы всегда можете расплющить, которые соответствуют и удалить дополнительный блок:

"a=N4JOJ7yZTi5urACYrKW5QQ==".split(/=(?!$|=)/); 
+0

Спасибо. '?:' Является неподключенной группой? –

+0

Что вы имеете в виду, у вас есть дополнительный матч_? –

+0

@RoyiNamir Любые круглые скобки '()' используются для добавления в ваше регулярное выражение нового совпадения. Чтобы исключить его из запоминаемых совпадений, используется '(? :)'. См. Также: https://developer.mozilla.org/en-US/docs/JavaScript/Guide/Regular_Expressions#special-non-capturing-parentheses. – VisioN

5

URL-адрес должен быть закодирован

'a=N4JOJ7yZTi5urACYrKW5QQ==' 

должно быть

'a=N4JOJ7yZTi5urACYrKW5QQ%3D%3D' 

Посмотрите на encodeURIComponent()

И если вы хотите использовать выражение рег, чтобы получить ключ от значения

> "abc=fooo".match(/([^=]+)=?(.*)?/); 
    ["abc=fooo", "abc", "fooo"] 
1

почему вы должны использовать раскол? regex матч с двумя захватами, например /^(.+)=(.+)$/, будет казаться более очевидным.

+0

+1 nice ........ (подумал, что мне нужно будет разделить на '&' ...) –

+0

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

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