Совпадение регулярных выражений JavaScript

#javascript #regex #pattern-matching

#javascript #регулярное выражение #сопоставление с шаблоном

Вопрос:

Рассмотрим следующее:

 var params = location.search.match(/=([wd-] )amp;?/g);
console.log(params);
  

Результат является:

 ["=7amp;", "=31500amp;", "=1"]
  

Я не вижу там никаких знаков, только цифры или слова, поэтому я установил круглые скобки, но это не работает. Итак, как мне это сделать?

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

1. не могли бы вы также предоставить входные данные, которые вы используете?

2. @Russ: Я бы сказал, что это что-то вроде «?foo =7amp;bar = 31500 amp; baz = 1». Это не так сложно вывести .. 😉

Ответ №1:

Получаете ли вы параметр querystring? Я думаю, это то, что вы хотите (хотя оно не использует регулярное выражение).

 <script type="text/javascript">
<!--
function querySt(ji) {
    hu = window.location.search.substring(1);
    gy = hu.split("amp;");
    for (i=0;i<gy.length;i  ) {
        ft = gy[i].split("=");
        if (ft[0] == ji) {
            return ft[1];
        }
    }
}

var koko = querySt("koko");

document.write(koko);
document.write("<br>");
document.write(hu);
-->
</script>
  

Ссылка: http://ilovethecode.com/Javascript/Javascript-Tutorials-How_To-Easy/Get_Query_String_Using_Javascript.shtml

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

1. 1: Не все, что может быть сделано с помощью regexen, должно быть сделано с помощью regexen.

2. @Residuum: В данном случае это достаточно легко сделать с помощью регулярного выражения.

Ответ №2:

Есть хорошая функция javascript под названием gup(), которая упрощает подобные вещи. Вот функция:

 function gup( name )
{
  name = name.replace(/[[]/,"\[").replace(/[]]/,"\]");
  var regexS = "[\?amp;]" name "=([^amp;#]*)";
  var regex = new RegExp( regexS );
  var results = regex.exec( window.location.href );
  if( results == null )
    return "";
  else
    return results[1];
}
  

и пример использования:

 var myVar = gup('myVar');
  

Итак, если ваша строка запроса выглядит следующим образом: ?myVar=asdf

myVar вернет ‘asdf’.

Ответ №3:

.match Метод возвращает всю сопоставленную строку, а не какие-либо группировки, которые вы определили с помощью круглых скобок.

Если вы хотите вернуть просто группировку в регулярном выражении, вам придется использовать .exec метод несколько раз и извлечь соответствующую группу из результирующего массива:

 var search = location.search, 
    param = /=([wd-] )amp;?/g, 
    params = [],
    match;
while ((match = param.exec(search)) != null) {
    params.push(match[1]);
}
console.log(params);
  

Это работает, потому что g флаг используется в регулярном выражении. Каждый раз, когда вы вызываете .exec для param регулярного выражения, его lastIndex атрибут устанавливается на следующую соответствующую подстроку, что, в свою очередь, гарантирует, что следующий вызов .exec начнет поиск со следующего совпадения. Результирующий массив содержит всю сопоставленную строку с индексом 0, затем каждую сопоставленную группу в последующих позициях. Таким образом, ваша группа возвращается как индекс 1 массива.