2015-12-01 18 views
2

Я имею следующую структуру URL:JS регулярное выражение возвращенная строка из URL

https://api.bestschool.com/student/1102003120009/tests/json 

Я хочу, чтобы вырезать идентификатор студента из URL. До сих пор я пришел с этим:

/(student\/.*[^\/]*)/ 

который возвращает

студент/1102003120009/тесты/JSON

Я хочу только удостоверение личности.

ответ

4

Вашей регулярных выражения (student\/.*[^\/]*) спичка и захватывает в 1-е группы буквальной последовательности student/, то соответствует любым другим, чем символ новой строки, 0 или более вхождений (.*) символов - которые могут соответствовать всей линии сразу! - и затем 0 или более символов, кроме /. Это не работает из-за .*. Кроме того, группу захвата следует перенести на шаблон [^\/]*.

Вы можете использовать следующее регулярное выражение и захватить группа 1 значение:

student\/([^\/]*) 

См regex demo

Регулярное выражение соответствует student/ буквально, а затем сопоставляются и захватывает в 1-й группе ноль или более символов других чем /.

В качестве альтернативы, если вы хотите, чтобы избежать использования захвата, и предполагая, что идентификатор всегда числовой и сопровождается /tests/, вы можете использовать следующее регулярное выражение:

\d+(?=\/tests\/) 

The \d+ матчи 1 или более цифр, и (?=\/tests\/) проверяет, правильно ли после цифр находится последовательность символов /tests/.

var re = /student\/([^\/]*)/; 
 
var str = 'https://api.bestschool.com/student/1102003120009/tests/json'; 
 
var m = str.match(re); 
 
if (m !== null) { 
 
    document.getElementById("r").innerHTML = "First method&nbsp;&nbsp;&nbsp;&nbsp;: " + m[1] + "<br/>"; 
 
} 
 
var m2 = str.match(/\d+(?=\/tests\/)/); 
 
if (m2 !== null) { 
 
    document.getElementById("r").innerHTML += "Second method: " + m2; 
 
}
<div id="r"/>

+0

Я должен спросить, почему это добавить его в массив? Не удается ли получить только идентификатор? между «student /» и «/ test» есть только одно: – user3800799

+1

Все зависит от контекста, в котором находится идентификатор. Если вам нужно, чтобы это было правильно между «student /' и '/ test», вам нужно использовать захват группы с помощью '/ sudent \/([^ \ /] *) \/test /' - и зафиксированное значение находится внутри 'm [1]'. См. Ссылку ['RegExp # match'] (https://developer.mozilla.org/pl/docs/Web/JavaScript/Reference/Global_Objects/String/match). Если вам просто нужно получить значение * numeric * перед '/ test', вы можете получить совпадение с' str.match (/ \ d + (? = \/Test) /) '. Как вы видите, все зависит от того, какую часть строки мы можем использовать в качестве контекста (= известные детали мы можем использовать литерал в регулярном выражении). –

+0

так много спасибо, спасибо, мой добрый сэр. – user3800799

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