Одна интересная вещь, с которой я столкнулся, это то, что вы можете иметь группу захвата внутри группы без захвата.Обратите внимание на регулярное выражение для соответствия веб-URL:
var parse_url_regex = /^(?:([A-Za-z]+):)(\/{0,3})([0-9.\-A-Za-z]+)(?::(\d+))?(?:\/([^?#]*))?(?:\?([^#]*))?(?:#(.*))?$/;
Строка URL-адреса ввода:
var url = "http://www.ora.com:80/goodparts?q#fragment";
Первая группа в моем регулярном выражении (?:([A-Za-z]+):)
- это группа без захвата, которая соответствуетсхема протокола и двоеточие :
символ, то есть http:
, но когда я работал под кодом ниже, я увидел, что первый индекс возвращаемого массива содержал строку http
, когда я думал, что http
и двоеточие :
оба не будут сообщены, поскольку они находятся в группе без захвата.
console.debug(parse_url_regex.exec(url));
![enter image description here](https://i.stack.imgur.com/uJher.png)
Я подумал, что первая группа (?:([A-Za-z]+):)
группа без захвата, почему она возвращает строку http
в выходном массиве.
Так что, если вы заметили, что внутри группы без захвата есть вложенная группа ([A-Za-z]+)
.Эта вложенная группа ([A-Za-z]+)
является группой захвата (не имеющей ?:
в начале) внутри самой группы захвата (?:([A-Za-z]+):)
.Вот почему текст http
все еще захватывается, но символ двоеточия :
, который находится внутри группы без захвата, но вне группы захвата, не отображается в массиве вывода.