URL 패턴

현행 표준 — 마지막 업데이트

참여:
GitHub whatwg/urlpattern (새 이슈, 열린 이슈)
Matrix에서 채팅하기
커밋:
GitHub whatwg/urlpattern/commits
이 커밋 기준 스냅샷
@urlpatterns
테스트:
web-platform-tests urlpattern/ (진행 중 작업)
번역 (비규범):
简体中文
日本語
한국어

요약

URL 패턴 현행 표준은 편리한 패턴 문법을 기반으로 URL을 매칭하는 웹 플랫폼 프리미티브를 제공합니다.

1. URL 패턴

1.1. 소개

URL 패턴은 여러 컴포넌트로 구성되며, 각각은 패턴을 나타내며, 해당 URL의 컴포넌트와 매칭될 수 있습니다.

각 컴포넌트에 대한 문자열이나 축약 문자열을 사용하여 생성할 수 있습니다. 선택적으로 기준 URL에 상대적으로 resolve할 수 있습니다.

축약형 "https://example.com/:category/*"는 다음 컴포넌트에 해당합니다:

protocol
"https"
username
"*"
password
"*"
hostname
"example.com"
port
""
pathname
"/:category/*"
search
"*"
hash
"*"

다음 URL들과 매칭됩니다:

다음 URL들과는 매칭되지 않습니다:

이 패턴은 대부분의 컴포넌트가 정확한 문자열과 일치하거나 모든 문자열("*")을 허용하는 비교적 단순한 패턴입니다. pathname 컴포넌트는 최소 두 개의 /로 구분된 경로 컴포넌트를 가진 모든 경로와 매칭되며, 첫 번째 경로는 "category"로 캡처됩니다.

축약형 "http{s}?://{:subdomain.}?shop.example/products/:id([0-9]+)#reviews"는 다음 컴포넌트에 해당합니다:

protocol
"http{s}?"
username
"*"
password
"*"
hostname
"{:subdomain.}?shop.example"
port
""
pathname
"/products/:id([0-9]+)"
search
""
hash
"reviews"

다음 URL들과 매칭됩니다:

다음 URL들과는 매칭되지 않습니다:

이 패턴은 다음과 같은 더 복잡한 특징을 포함합니다:

기준 URL "https://discussion.example/forum/?page=2"에 대해 축약형 "../admin/*"는 다음 컴포넌트에 해당합니다:

protocol
"https"
username
"*"
password
"*"
hostname
"discussion.example"
port
""
pathname
"/admin/*"
search
"*"
hash
"*"

다음 URL들과 매칭됩니다:

다음 URL들과는 매칭되지 않습니다:

이 패턴은 상대 경로가 기준 URL에 대해 어떻게 resolve되는지, 즉 상대 URL처럼 동작함을 보여줍니다.

1.2. URLPattern 클래스

typedef (USVString or URLPatternInit) URLPatternInput;

[Exposed=(Window,Worker)]
interface URLPattern {
  constructor(URLPatternInput input, USVString baseURL, optional URLPatternOptions options = {});
  constructor(optional URLPatternInput input = {}, optional URLPatternOptions options = {});

  boolean test(optional URLPatternInput input = {}, optional USVString baseURL);

  URLPatternResult? exec(optional URLPatternInput input = {}, optional USVString baseURL);

  readonly attribute USVString protocol;
  readonly attribute USVString username;
  readonly attribute USVString password;
  readonly attribute USVString hostname;
  readonly attribute USVString port;
  readonly attribute USVString pathname;
  readonly attribute USVString search;
  readonly attribute USVString hash;

  readonly attribute boolean hasRegExpGroups;
};

dictionary URLPatternInit {
  USVString protocol;
  USVString username;
  USVString password;
  USVString hostname;
  USVString port;
  USVString pathname;
  USVString search;
  USVString hash;
  USVString baseURL;
};

dictionary URLPatternOptions {
  boolean ignoreCase = false;
};

dictionary URLPatternResult {
  sequence<URLPatternInput> inputs;

  URLPatternComponentResult protocol;
  URLPatternComponentResult username;
  URLPatternComponentResult password;
  URLPatternComponentResult hostname;
  URLPatternComponentResult port;
  URLPatternComponentResult pathname;
  URLPatternComponentResult search;
  URLPatternComponentResult hash;
};

dictionary URLPatternComponentResult {
  USVString input;
  record<USVString, (USVString or undefined)> groups;
};

URLPattern연관 URL 패턴을 가지며, 이는 URL 패턴입니다.

urlPattern = new URLPattern(input)
새로운 URLPattern 객체를 생성합니다. input은 각 URL 컴포넌트별 패턴을 포함하는 객체입니다(예: hostname, pathname 등). 누락된 컴포넌트는 와일드카드 패턴으로 기본값이 설정됩니다. 또한, input에는 누락된 컴포넌트에 대한 정적 텍스트 패턴을 제공하는 baseURL 속성을 포함할 수 있습니다.
urlPattern = new URLPattern(patternString, baseURL)
새로운 URLPattern 객체를 생성합니다. patternString은 하나 이상의 컴포넌트에 대한 패턴 문법을 포함하는 URL 문자열입니다. baseURL이 제공되면 patternString을 상대 경로로 사용할 수 있습니다. 이 생성자는 항상 최소한 빈 문자열 값을 설정하며, 컴포넌트를 와일드카드 패턴으로 기본값을 설정하지 않습니다.
urlPattern = new URLPattern(input, options)
새로운 URLPattern 객체를 생성합니다. options는 컴포넌트의 매칭 방식에 영향을 줄 수 있는 추가 구성 옵션을 포함하는 객체입니다. 현재는 대소문자 구분 없이 매칭을 활성화할 수 있는 ignoreCase 속성만 있습니다.

기본적으로, 즉 options 인자가 없는 경우, 매칭은 항상 대소문자를 구분합니다.

urlPattern = new URLPattern(patternString, baseURL, options)
새로운 URLPattern 객체를 생성합니다. 이 생성자는 URLPatternOptions 객체를 지원하며, patternString 객체에서 컴포넌트별 패턴과 기준 URL을 기술합니다.
matches = urlPattern.test(input)
urlPattern이 주어진 인자와 매칭되는지 검사합니다. input은 각 URL 컴포넌트를 나타내는 문자열을 포함하는 객체입니다(예: hostname, pathname 등). 누락된 컴포넌트는 빈 문자열로 처리됩니다. 또한 input에는 누락된 컴포넌트에 대한 값을 제공하는 baseURL 속성을 포함할 수 있습니다. urlPattern이 각 컴포넌트별로 input과 매칭된다면 true를 반환, 그렇지 않으면 false를 반환합니다.
matches = urlPattern.test(url, baseURL)
urlPattern이 주어진 인자와 매칭되는지 검사합니다. url은 URL 문자열입니다. baseURL이 주어지면 url은 상대 경로가 될 수 있습니다.

urlPattern이 각 컴포넌트별로 input과 매칭된다면 true를 반환, 그렇지 않으면 false를 반환합니다.

result = urlPattern.exec(input)
urlPattern을 주어진 인자에 대해 실행합니다. input은 각 URL 컴포넌트를 나타내는 문자열을 포함하는 객체입니다(예: hostname, pathname 등). 누락된 컴포넌트는 빈 문자열로 처리됩니다. 또한 input에는 누락된 컴포넌트에 대한 값을 제공하는 baseURL 속성을 포함할 수 있습니다.

urlPattern이 각 컴포넌트별로 input과 매칭된다면 결과 객체를 반환합니다. 매칭된 그룹 값은 result 객체 내에서 컴포넌트별 그룹 객체에 포함됩니다(예: matches.pathname.groups.id). urlPatterninput과 매칭되지 않으면 result는 null입니다.

result = urlPattern.exec(url, baseURL)
urlPattern을 주어진 인자에 대해 실행합니다. url은 URL 문자열입니다. baseURL이 주어지면 input은 상대 경로가 될 수 있습니다.

urlPattern이 각 컴포넌트별로 input과 매칭된다면 결과 객체를 반환합니다. 매칭된 그룹 값은 result 객체 내에서 컴포넌트별 그룹 객체에 포함됩니다(예: matches.pathname.groups.id). urlPatterninput과 매칭되지 않으면 result는 null입니다.

urlPattern.protocol

urlPattern의 정규화된 protocol 패턴 문자열을 반환합니다.

urlPattern.username

urlPattern의 정규화된 username 패턴 문자열을 반환합니다.

urlPattern.password

urlPattern의 정규화된 password 패턴 문자열을 반환합니다.

urlPattern.hostname

urlPattern의 정규화된 hostname 패턴 문자열을 반환합니다.

urlPattern.port

urlPattern의 정규화된 port 패턴 문자열을 반환합니다.

urlPattern.pathname

urlPattern의 정규화된 pathname 패턴 문자열을 반환합니다.

urlPattern.search

urlPattern의 정규화된 search 패턴 문자열을 반환합니다.

urlPattern.hash

urlPattern의 정규화된 hash 패턴 문자열을 반환합니다.

urlPattern.hasRegExpGroups

urlPattern에 하나 이상의 정규표현식 그룹이 포함되어 있는지 여부를 반환합니다.

new URLPattern(input, baseURL, options) 생성자 단계:
  1. initializethis, input, baseURL, options에 대해 실행합니다.

new URLPattern(input, options) 생성자 단계:
  1. initializethis, input, null, options에 대해 실행합니다.

initializeURLPattern this, URLPatternInput input, string 또는 null baseURL, URLPatternOptions options에 대해:
  1. this연관 URL 패턴create의 결과로 설정합니다. 인자로는 input, baseURL, options를 사용합니다.

protocol getter 단계:
  1. this연관 URL 패턴protocol 컴포넌트패턴 문자열을 반환합니다.

username getter 단계:
  1. this연관 URL 패턴username 컴포넌트패턴 문자열을 반환합니다.

password getter 단계:
  1. this연관 URL 패턴password 컴포넌트패턴 문자열을 반환합니다.

hostname getter 단계:
  1. this연관 URL 패턴hostname 컴포넌트패턴 문자열을 반환합니다.

port getter 단계:
  1. this연관 URL 패턴port 컴포넌트패턴 문자열을 반환합니다.

pathname getter 단계:
  1. this연관 URL 패턴pathname 컴포넌트패턴 문자열을 반환합니다.

search getter 단계:
  1. this연관 URL 패턴search 컴포넌트패턴 문자열을 반환합니다.

hash getter 단계:
  1. this연관 URL 패턴hash 컴포넌트패턴 문자열을 반환합니다.

hasRegExpGroups getter 단계:
  1. this연관 URL 패턴정규표현식 그룹 포함 여부가 true면 true 반환.

  2. false 반환.

test(input, baseURL) 메서드 단계:
  1. resultmatch의 결과를 저장합니다. 인자는 this연관 URL 패턴, input, baseURL(있으면)입니다.

  2. result가 null이면 false 반환.

  3. true 반환.

exec(input, baseURL) 메서드 단계:
  1. match의 결과를 반환합니다. 인자는 this연관 URL 패턴, input, baseURL(있으면)입니다.

1.3. URL 패턴 구조체

URL 패턴구조체이며, 다음 항목을 포함합니다:

컴포넌트구조체이며, 다음 항목을 포함합니다:

1.4. 고수준 연산

createURLPatternInput input, string 또는 null baseURL, URLPatternOptions optionsURL 패턴을 생성하려면:
  1. init을 null로 설정합니다.

  2. input스칼라 값 문자열이면:

    1. init생성자 문자열 파싱의 결과로 설정합니다. 인자는 input입니다.

    2. baseURL이 null이고 init["protocol"] 이 존재하지 않으면, TypeError를 throw합니다.

    3. baseURL이 null이 아니면, 설정 init["baseURL"] 을 baseURL로 설정합니다.

  3. 그 외의 경우:

    1. 단언: inputURLPatternInit입니다.

    2. baseURL이 null이 아니면, TypeError를 throw합니다.

    3. initinput으로 설정합니다.

  4. processedInitURLPatternInit 처리의 결과로 설정합니다. 인자는 init, "pattern", null, null, null, null, null, null, null, null입니다.

  5. componentName에 대해 « "protocol", "username", "password", "hostname", "port", "pathname", "search", "hash" »:

    1. processedInit[componentName]이 존재하지 않으면, 설정 processedInit[componentName]을 "*"로 설정합니다.

  6. processedInit["protocol"] 이 특수 scheme이고 processedInit["port"] 가 기본 포트를 radix-10 ASCII 숫자로 표현한 문자열이면 processedInit["port"] 을 빈 문자열로 설정합니다.

  7. urlPattern을 새 URL 패턴으로 생성합니다.

  8. urlPatternprotocol 컴포넌트컴포넌트 컴파일의 결과로 설정합니다. 인자는 processedInit["protocol"], 프로토콜 정규화, 기본 옵션입니다.

  9. urlPatternusername 컴포넌트컴포넌트 컴파일의 결과로 설정합니다. 인자는 processedInit["username"], username 정규화, 기본 옵션입니다.

  10. urlPatternpassword 컴포넌트컴포넌트 컴파일의 결과로 설정합니다. 인자는 processedInit["password"], password 정규화, 기본 옵션입니다.

  11. hostname 패턴이 IPv6 주소인지 processedInit["hostname"]에 대해 실행한 결과가 true이면, urlPatternhostname 컴포넌트컴포넌트 컴파일의 결과로 설정합니다. 인자는 processedInit["hostname"], IPv6 hostname 정규화, hostname 옵션입니다.

  12. 그 외의 경우, urlPatternhostname 컴포넌트컴포넌트 컴파일의 결과로 설정합니다. 인자는 processedInit["hostname"], hostname 정규화, hostname 옵션입니다.

  13. urlPatternport 컴포넌트컴포넌트 컴파일의 결과로 설정합니다. 인자는 processedInit["port"], port 정규화, 기본 옵션입니다.

  14. compileOptions기본 옵션을 복사한 것으로, ignore case 속성을 options["ignoreCase"]로 설정합니다.

  15. protocol 컴포넌트가 특수 scheme과 매칭되는지 urlPatternprotocol 컴포넌트에 대해 실행한 결과가 true이면:

    1. pathCompileOptionspathname 옵션을 복사한 것으로, ignore case 속성을 options["ignoreCase"]로 설정합니다.

    2. urlPatternpathname 컴포넌트컴포넌트 컴파일의 결과로 설정합니다. 인자는 processedInit["pathname"], pathname 정규화, pathCompileOptions입니다.

  16. 그 외의 경우 urlPatternpathname 컴포넌트컴포넌트 컴파일의 결과로 설정합니다. 인자는 processedInit["pathname"], 불투명 pathname 정규화, compileOptions입니다.

  17. urlPatternsearch 컴포넌트컴포넌트 컴파일의 결과로 설정합니다. 인자는 processedInit["search"], search 정규화, compileOptions입니다.

  18. urlPatternhash 컴포넌트컴포넌트 컴파일의 결과로 설정합니다. 인자는 processedInit["hash"], hash 정규화, compileOptions입니다.

  19. urlPattern을 반환합니다.

매칭(match)을 수행하려면 URL 패턴 urlPattern, URLPatternInput 또는 URL input, 그리고 선택적 문자열 baseURLString을 받아 다음을 수행합니다:
  1. protocol을 빈 문자열로 설정합니다.

  2. username을 빈 문자열로 설정합니다.

  3. password를 빈 문자열로 설정합니다.

  4. hostname을 빈 문자열로 설정합니다.

  5. port를 빈 문자열로 설정합니다.

  6. pathname을 빈 문자열로 설정합니다.

  7. search를 빈 문자열로 설정합니다.

  8. hash를 빈 문자열로 설정합니다.

  9. inputs를 빈 리스트로 설정합니다.

  10. inputURL이면, append를 사용해 input의 직렬화inputs에 추가합니다.

  11. 그 외의 경우, append를 사용해 inputinputs에 추가합니다.

  12. inputURLPatternInit 이면:

    1. baseURLString이 주어졌으면 TypeError를 throw합니다.

    2. applyResultURLPatternInit 처리의 결과로 설정합니다. 인자는 input, "url", protocol, username, password, hostname, port, pathname, search, hash입니다. 예외 발생 시, 잡아서 null을 반환합니다.

    3. protocolapplyResult["protocol"]로 설정합니다.

    4. usernameapplyResult["username"]로 설정합니다.

    5. passwordapplyResult["password"]로 설정합니다.

    6. hostnameapplyResult["hostname"]로 설정합니다.

    7. portapplyResult["port"]로 설정합니다.

    8. pathnameapplyResult["pathname"]로 설정합니다.

    9. searchapplyResult["search"]로 설정합니다.

    10. hashapplyResult["hash"]로 설정합니다.

  13. 그 외의 경우:

    1. urlinput으로 설정합니다.

    2. inputUSVString이면:

      1. baseURL을 null로 설정합니다.

      2. baseURLString이 주어졌으면,

        1. baseURL기본 URL 파서baseURLString을 넘겨 실행한 결과로 설정합니다.

        2. baseURL이 실패이면 null을 반환합니다.

        3. append를 사용해 baseURLStringinputs에 추가합니다.

      3. url기본 URL 파서inputbaseURL을 넘겨 실행한 결과로 설정합니다.

      4. url이 실패이면 null을 반환합니다.

    3. 단언: urlURL입니다.

    4. protocolurlscheme으로 설정합니다.

    5. usernameurlusername으로 설정합니다.

    6. passwordurlpassword로 설정합니다.

    7. hostnameurlhost직렬화 값 또는 값이 null이면 빈 문자열로 설정합니다.

    8. porturlport직렬화 값 또는 값이 null이면 빈 문자열로 설정합니다.

    9. pathnameURL 경로 직렬화url에 실행한 결과로 설정합니다.

    10. searchurlquery 또는 값이 null이면 빈 문자열로 설정합니다.

    11. hashurlfragment 또는 값이 null이면 빈 문자열로 설정합니다.

  14. protocolExecResultRegExpBuiltinExec(urlPatternprotocol 컴포넌트정규표현식, protocol)의 결과로 설정합니다.

  15. usernameExecResultRegExpBuiltinExec(urlPatternusername 컴포넌트정규표현식, username)의 결과로 설정합니다.

  16. passwordExecResultRegExpBuiltinExec(urlPatternpassword 컴포넌트정규표현식, password)의 결과로 설정합니다.

  17. hostnameExecResultRegExpBuiltinExec(urlPatternhostname 컴포넌트정규표현식, hostname)의 결과로 설정합니다.

  18. portExecResultRegExpBuiltinExec(urlPatternport 컴포넌트정규표현식, port)의 결과로 설정합니다.

  19. pathnameExecResultRegExpBuiltinExec(urlPatternpathname 컴포넌트정규표현식, pathname)의 결과로 설정합니다.

  20. searchExecResultRegExpBuiltinExec(urlPatternsearch 컴포넌트정규표현식, search)의 결과로 설정합니다.

  21. hashExecResultRegExpBuiltinExec(urlPatternhash 컴포넌트정규표현식, hash)의 결과로 설정합니다.

  22. protocolExecResult, usernameExecResult, passwordExecResult, hostnameExecResult, portExecResult, pathnameExecResult, searchExecResult, hashExecResult 중 하나라도 null이면 null을 반환합니다.

  23. result를 새 URLPatternResult로 생성합니다.

  24. result["inputs"] 를 inputs로 설정합니다.

  25. result["protocol"] 을 컴포넌트 매칭 결과 생성의 결과로 설정합니다. 인자는 urlPatternprotocol 컴포넌트, protocol, protocolExecResult입니다.

  26. result["username"] 을 컴포넌트 매칭 결과 생성의 결과로 설정합니다. 인자는 urlPatternusername 컴포넌트, username, usernameExecResult입니다.

  27. result["password"] 을 컴포넌트 매칭 결과 생성의 결과로 설정합니다. 인자는 urlPatternpassword 컴포넌트, password, passwordExecResult입니다.

  28. result["hostname"] 을 컴포넌트 매칭 결과 생성의 결과로 설정합니다. 인자는 urlPatternhostname 컴포넌트, hostname, hostnameExecResult입니다.

  29. result["port"] 을 컴포넌트 매칭 결과 생성의 결과로 설정합니다. 인자는 urlPatternport 컴포넌트, port, portExecResult입니다.

  30. result["pathname"] 을 컴포넌트 매칭 결과 생성의 결과로 설정합니다. 인자는 urlPatternpathname 컴포넌트, pathname, pathnameExecResult입니다.

  31. result["search"] 을 컴포넌트 매칭 결과 생성의 결과로 설정합니다. 인자는 urlPatternsearch 컴포넌트, search, searchExecResult입니다.

  32. result["hash"] 을 컴포넌트 매칭 결과 생성의 결과로 설정합니다. 인자는 urlPatternhash 컴포넌트, hash, hashExecResult입니다.

  33. result를 반환합니다.

URL 패턴 urlPattern정규표현식 그룹을 포함하는지 판단하려면 다음 과정을 수행하여 true를 반환하면 포함, 아니면 false입니다:
  1. urlPatternprotocol 컴포넌트정규표현식 그룹 포함 여부가 true면 true를 반환합니다.

  2. urlPatternusername 컴포넌트정규표현식 그룹 포함 여부가 true면 true를 반환합니다.

  3. urlPatternpassword 컴포넌트정규표현식 그룹 포함 여부가 true면 true를 반환합니다.

  4. urlPatternhostname 컴포넌트정규표현식 그룹 포함 여부가 true면 true를 반환합니다.

  5. urlPatternport 컴포넌트정규표현식 그룹 포함 여부가 true면 true를 반환합니다.

  6. urlPatternpathname 컴포넌트정규표현식 그룹 포함 여부가 true면 true를 반환합니다.

  7. urlPatternsearch 컴포넌트정규표현식 그룹 포함 여부가 true면 true를 반환합니다.

  8. urlPatternhash 컴포넌트정규표현식 그룹 포함 여부가 true면 true를 반환합니다.

  9. false를 반환합니다.

1.5. 내부 동작

컴포넌트 컴파일을 수행하려면 문자열 input, 인코딩 콜백 encoding callback, 옵션 options을 받아 다음을 수행합니다:
  1. part list패턴 문자열 파싱input, options, encoding callback을 넘겨 실행한 결과로 설정합니다.

  2. (regular expression string, name list)를 정규표현식 및 이름 목록 생성part list, options를 넘겨 실행한 결과로 설정합니다.

  3. flags를 빈 문자열로 설정합니다.

  4. optionsignore case가 true면 flags를 "vi"로 설정합니다.

  5. 그 외의 경우 flags를 "v"로 설정합니다.

  6. regular expressionRegExpCreate(regular expression string, flags)로 생성합니다. 예외 발생 시, 잡아서 TypeError를 throw합니다.

    이 명세는 모든 매칭에 정규표현식을 사용하지만, 반드시 강제되는 것은 아닙니다. 구현에서는 커스텀 regexp 매칭 그룹이 없을 때 part list에 직접 매칭을 수행해도 됩니다. 단, 커스텀 정규표현식이 있을 때는 반드시 컴포넌트 컴파일 알고리즘에서 바로 평가하여 유효하지 않은 경우 에러를 발생시켜야 합니다.

  7. pattern string패턴 문자열 생성part list, options를 넘겨 실행한 결과로 설정합니다.

  8. has regexp groups를 false로 설정합니다.

  9. part에 대해 part list를 순회합니다:

    1. parttype이 "regexp"이면 has regexp groups를 true로 설정합니다.

  10. 컴포넌트 객체를 생성하여 반환합니다. 패턴 문자열pattern string, 정규표현식regular expression, 그룹 이름 목록name list, 정규표현식 그룹 포함 여부has regexp groups입니다.

컴포넌트 매칭 결과 생성을 수행하려면 컴포넌트 component, 문자열 input, RegExpBuiltinExec execResult 배열을 받아 다음을 수행합니다:
  1. result를 새 URLPatternComponentResult로 생성합니다.

  2. result["input"]에 input을 설정합니다.

  3. groupsrecord<USVString, (USVString 또는 undefined)>로 생성합니다.

  4. index를 1로 설정합니다.

  5. indexGet(execResult, "length")보다 작을 때까지 반복합니다:

    1. namecomponent그룹 이름 목록[index − 1]로 설정합니다.

    2. valueGet(execResult, ToString(index))로 설정합니다.

    3. groups[name]에 value를 설정합니다.

    4. index를 1 증가시킵니다.

  6. result["groups"]에 groups를 설정합니다.

  7. result를 반환합니다.

더미 URL 생성을 수행하려면:
  1. dummyInput을 "https://dummy.invalid/"로 설정합니다.

  2. dummyInput에 대해 기본 URL 파서를 실행한 결과를 반환합니다.

기본 옵션옵션 구조체로, delimiter code point는 빈 문자열, prefix code point는 빈 문자열로 설정합니다.

hostname 옵션옵션 구조체로, delimiter code point는 ".", prefix code point는 빈 문자열로 설정합니다.

pathname 옵션옵션 구조체로, delimiter code point는 "/", prefix code point는 "/"로 설정합니다.

protocol 컴포넌트가 특수 scheme과 매칭되는지를 판단하려면 컴포넌트 protocol component를 받아 다음을 수행합니다:
  1. special scheme list리스트로, 모든 특수 scheme으로 채워집니다.

  2. scheme에 대해 special scheme list를 순회합니다:

    1. test resultRegExpBuiltinExec(protocol component정규표현식, scheme)로 설정합니다.

    2. test result가 null이 아니면 true를 반환합니다.

  3. false를 반환합니다.

hostname 패턴이 IPv6 주소인지 판단하려면 패턴 문자열 input을 받아 다음을 수행합니다:
  1. inputcode point 길이가 2 미만이면 false를 반환합니다.

  2. input code pointsinput리스트code point로 해석합니다.

  3. input code points[0]가 U+005B ([)이면 true를 반환합니다.

  4. input code points[0]가 U+007B ({)이고 input code points[1] 가 U+005B ([)이면 true를 반환합니다.

  5. input code points[0]가 U+005C (\)이고 input code points[1] 가 U+005B ([)이면 true를 반환합니다.

  6. false를 반환합니다.

1.6. 생성자 문자열 파싱

생성자 문자열 파서구조체입니다.

생성자 문자열 파서input이라는 문자열을 가지며, 생성 시 반드시 설정되어야 합니다.

생성자 문자열 파서토큰 리스트라는 토큰 리스트를 가지며, 생성 시 반드시 설정되어야 합니다.

생성자 문자열 파서result라는 URLPatternInit를 가지며, 초기값은 새 URLPatternInit입니다.

생성자 문자열 파서컴포넌트 시작이라는 숫자를 가지며, 초기값은 0입니다.

생성자 문자열 파서토큰 인덱스라는 숫자를 가지며, 초기값은 0입니다.

생성자 문자열 파서토큰 증가값이라는 숫자를 가지며, 초기값은 1입니다.

생성자 문자열 파서그룹 깊이라는 숫자를 가지며, 초기값은 0입니다.

생성자 문자열 파서hostname IPv6 대괄호 깊이라는 숫자를 가지며, 초기값은 0입니다.

생성자 문자열 파서프로토콜 특수 scheme 매칭 플래그라는 boolean 값을 가지며, 초기값은 false입니다.

생성자 문자열 파서상태라는 문자열을 가지며, 초기값은 "init"입니다. 다음 중 하나여야 합니다:

URLPattern 생성자 문자열 알고리즘은 기본 URL 파서 알고리즘과 매우 유사하지만, 직접 사용할 수 없게 만드는 몇 가지 차이점이 있습니다.

첫째, URLPattern 생성자 문자열 파서는 "lenient" 토크나이즈 정책을 사용해 생성된 토큰에 대해 동작합니다. 반면 기본 URL 파서는 코드 포인트에 대해 동작합니다. 토큰을 사용하면 URLPattern 생성자 문자열 파서가 패턴 문법에서 의미 있는 코드 포인트와 URL 컴포넌트 구분자일 수 있는 코드 포인트를 더 쉽게 구분할 수 있습니다. 예를 들어, "https://a.c:hmm.example.com:8080"에서 포트 번호와 혼동하지 않고 ":hmm" 같은 이름 그룹을 다루기가 훨씬 쉬워집니다.

둘째, URLPattern 생성자 문자열 파서는 모든 코드 포인트에 대해 URL 정규화를 적용하지 않아야 합니다. 기본 URL 파서와 달리, 우리는 각 컴포넌트 패턴 문자열을 컴파일할 때 안전하다고 판단되는 부분에만 정규화를 수행합니다.

마지막으로, URLPattern 생성자 문자열 파서는 기본 URL 파서 상태 머신의 일부를 처리하지 않습니다. 예를 들어, 역슬래시를 특별하게 다루지 않는데, 이는 모두 패턴 문자로 처리되며 과도한 이스케이프가 필요하기 때문입니다. 또한, 이 파서는 파일 URL에서 hostname이 있는 것 같은 더 특이한 부분은 다루지 않을 수 있습니다. 이 파서의 목표는 가장 일반적인 URL을 처리하면서, 니치 케이스는 URLPatternInit 생성자를 통해 처리할 수 있도록 하는 것입니다.

생성자 문자열 알고리즘에서 pathname, search, hash는 앞의 컴포넌트가 지정되고 뒤의 컴포넌트가 지정되지 않은 경우 와일드카드됩니다. 예를 들어, "https://example.com/foo"는 모든 search와 모든 hash와 매칭됩니다. 마찬가지로 "https://example.com"은 해당 origin의 모든 URL과 매칭됩니다. 이는 URLPatternInit 처리 노트에서 언급된 더 구체적인 컴포넌트 개념과 유사하지만, 생성자 구문에서는 더 구체적인 컴포넌트를 덜 구체적인 컴포넌트를 지정하지 않고도 지정할 수 있는 경우가 몇 가지뿐입니다.

username과 password 컴포넌트는 명시적으로 지정하지 않으면 항상 와일드카드입니다.

hostname이 지정되고 port가 지정되지 않으면 port는 기본 포트로 간주됩니다. 모든 포트와 매칭하려면 :*를 명시적으로 작성해야 합니다. 예를 들어, "https://*"은 포트 443의 모든 HTTPS origin이고, "https://*:*"은 모든 포트의 모든 HTTPS origin입니다.

생성자 문자열 파싱을 수행하려면 문자열 input을 받아 다음을 수행합니다:
  1. parser를 새 생성자 문자열 파서로 생성합니다. inputinput이고 토큰 리스트토크나이즈input과 "lenient"으로 실행한 결과입니다.

  2. While parser토큰 인덱스parser토큰 리스트 길이보다 작은 동안:

    1. parser토큰 증가값을 1로 설정합니다.

      파싱 루프의 모든 반복마다 parser토큰 인덱스토큰 증가값만큼 증가합니다. 일반적으로 1씩 증가하지만, 특정 시점에는 0으로 설정될 때도 있습니다. 토큰 증가값은 항상 루프 상단에서 1로 리셋됩니다.

    2. parser토큰 리스트[parser토큰 인덱스]의 타입이 "end"이면:

      1. parser상태가 "init"이면:

        "init" 상태에서 문자열의 끝에 도달했다면, 프로토콜 종결자를 찾지 못했으므로 상대 URLPattern 생성자 문자열이어야 합니다.

        1. rewindparser에 대해 실행합니다.

          이후 상대 패턴이 어느 컴포넌트에서 시작하는지 결정합니다. 상대 경로(pathname)가 가장 일반적이지만, URL 및 URLPattern 생성자 문자열은 search나 hash 컴포넌트로도 시작할 수 있습니다.

        2. is a hash prefixparser에 대해 실행한 결과가 true면 change stateparser, "hash"와 1로 실행합니다.

        3. 그 외 is a search prefixparser에 대해 실행한 결과가 true면:

          1. change stateparser, "search"와 1로 실행합니다.

        4. 그 외에는:

          1. change stateparser, "pathname"와 0으로 실행합니다.

        5. parser토큰 인덱스토큰 증가값만큼 증가시킵니다.

        6. Continue.

      2. parser상태가 "authority"이면:

        "authority" 상태에서 문자열의 끝에 도달했다면, "@"를 찾지 못했으므로 username이나 password가 없습니다.

        1. rewind and set stateparser와 "hostname"로 실행합니다.

        2. parser토큰 인덱스토큰 증가값만큼 증가시킵니다.

        3. Continue.

      3. change stateparser, "done"와 0으로 실행합니다.

      4. Break.

    3. is a group openparser에 대해 실행한 결과가 true면:

      "{ ... }" 패턴 그룹 내의 모든 코드 포인트는 무시합니다. 예를 들어, "https://example.c{om/fo}o"처럼 그룹 내에 URL 컴포넌트 경계가 있는 것은 허용되지 않습니다. well formed 패턴 문자열에서는 지원되지 않지만, 파서 혼란을 피하기 위해 여기서는 중첩 그룹도 처리합니다.

      정규표현식이나 이름 그룹에는 이 로직이 필요하지 않습니다. 해당 값들은 토큰으로 토크나이즈 알고리즘에서 이미 병합되기 때문입니다.

      1. parser그룹 깊이를 1 증가시킵니다.

      2. parser토큰 인덱스토큰 증가값만큼 증가시킵니다.

      3. Continue.

    4. parser그룹 깊이가 0보다 크면:

      1. is a group closeparser에 대해 실행한 결과가 true면 parser그룹 깊이를 1 감소시킵니다.

      2. 그 외에는:

        1. parser토큰 인덱스토큰 증가값만큼 증가시킵니다.

        2. Continue.

    5. parser상태에 따라 아래 과정을 실행합니다:

      "init"
      1. is a protocol suffixparser에 대해 실행한 결과가 true면:

        1. rewind and set stateparser와 "protocol"로 실행합니다.

      "protocol"
      1. is a protocol suffixparser에 대해 실행한 결과가 true면:

        1. compute protocol matches a special scheme flagparser에 대해 실행합니다.

          프로토콜 컴포넌트가 특수 scheme과 매칭되는지 미리 컴파일해야 합니다. 매칭된다면 특별 규칙이 적용됩니다. pathname이 기본적으로 "/"가 되는지, username, password, hostname, port 컴포넌트를 찾을지 결정합니다. authority 슬래시가 있으면 해당 컴포넌트들도 찾고, 그렇지 않으면 "불투명 경로 URL"로 간주하여 바로 pathname 컴포넌트로 이동합니다.

        2. next state를 "pathname"로 설정합니다.

        3. skip을 1로 설정합니다.

        4. next is authority slashesparser에 대해 실행한 결과가 true면:

          1. next state를 "authority"로 설정합니다.

          2. skip을 3으로 설정합니다.

        5. 그 외 parser프로토콜 특수 scheme 매칭 플래그가 true면 next state를 "authority"로 설정합니다.

        6. change stateparser, next state, skip로 실행합니다.

      "authority"
      1. is an identity terminatorparser에 대해 실행한 결과가 true면 rewind and set stateparser와 "username"로 실행합니다.

      2. 그 외 아래 중 하나라도 true면:

        위 중 하나라도 true면 rewind and set stateparser와 "hostname"로 실행합니다.

      "username"
      1. is a password prefixparser에 대해 실행한 결과가 true면 change stateparser, "password", 1로 실행합니다.

      2. 그 외 is an identity terminatorparser에 대해 실행한 결과가 true면 change stateparser, "hostname", 1로 실행합니다.

      "password"
      1. is an identity terminatorparser에 대해 실행한 결과가 true면 change stateparser, "hostname", 1로 실행합니다.

      "hostname"
      1. is an IPv6 openparser에 대해 실행한 결과가 true면 parserhostname IPv6 대괄호 깊이를 1 증가시킵니다.

      2. 그 외 is an IPv6 closeparser에 대해 실행한 결과가 true면 parserhostname IPv6 대괄호 깊이를 1 감소시킵니다.

      3. 그 외 is a port prefixparser에 대해 실행한 결과가 true고 parserhostname IPv6 대괄호 깊이가 0이면 change stateparser, "port", 1로 실행합니다.

      4. 그 외 is a pathname startparser에 대해 실행한 결과가 true면 change stateparser, "pathname", 0으로 실행합니다.

      5. 그 외 is a search prefixparser에 대해 실행한 결과가 true면 change stateparser, "search", 1로 실행합니다.

      6. 그 외 is a hash prefixparser에 대해 실행한 결과가 true면 change stateparser, "hash", 1로 실행합니다.

      "port"
      1. is a pathname startparser에 대해 실행한 결과가 true면 change stateparser, "pathname", 0으로 실행합니다.

      2. 그 외 is a search prefixparser에 대해 실행한 결과가 true면 change stateparser, "search", 1로 실행합니다.

      3. 그 외 is a hash prefixparser에 대해 실행한 결과가 true면 change stateparser, "hash", 1로 실행합니다.

      "pathname"
      1. is a search prefixparser에 대해 실행한 결과가 true면 change stateparser, "search", 1로 실행합니다.

      2. 그 외 is a hash prefixparser에 대해 실행한 결과가 true면 change stateparser, "hash", 1로 실행합니다.

      "search"
      1. is a hash prefixparser에 대해 실행한 결과가 true면 change stateparser, "hash", 1로 실행합니다.

      "hash"
      1. 아무 것도 하지 않습니다.

      "done"
      1. 단언: 이 단계에는 도달하지 않습니다.

    6. parser토큰 인덱스토큰 증가값만큼 증가시킵니다.

  3. parserresult "hostname" 이 있고, "port" 가 없으면, parserresult["port"] 를 빈 문자열로 설정합니다.

    이 경우는 특별 취급합니다. 작성자가 포트를 지정하지 않으면 기본 포트를 의도하는 경우가 많기 때문입니다. 모든 포트를 허용하려면 와일드카드를 명시적으로 지정해야 합니다. 예를 들어, "https://example.com/*"은 "https://example.com:8443/"로 시작하는 URL과 매칭되지 않습니다.
  4. parserresult를 반환합니다.

상태 변경을 수행하려면 생성자 문자열 파서 parser, 상태 new state, 숫자 skip을 받아 다음을 수행합니다:
  1. parserstate가 "init", "authority", "done"가 아니면, parserresult[parserstate]에 컴포넌트 문자열 생성parser에 대해 실행한 결과를 설정합니다.

  2. parserstate가 "init"가 아니고 new state가 "done"가 아니면:

    1. parserstate가 "protocol", "authority", "username", 또는 "password"; new state가 "port", "pathname", "search", 또는 "hash"; 그리고 parserresult["hostname"] 가 존재하지 않으면, parserresult["hostname"] 를 빈 문자열로 설정합니다.

    2. parserstate가 "protocol", "authority", "username", "password", "hostname", 또는 "port"; new state가 "search" 또는 "hash"; 그리고 parserresult["pathname"] 가 존재하지 않으면,

      1. parser프로토콜 특수 scheme 매칭 플래그가 true면 parserresult["pathname"] 를 "/"로 설정합니다.

      2. 그 외에는 parserresult["pathname"] 를 빈 문자열로 설정합니다.

    3. parserstate가 "protocol", "authority", "username", "password", "hostname", "port", 또는 "pathname"; new state가 "hash"; 그리고 parserresult["search"] 가 존재하지 않으면, parserresult["search"] 를 빈 문자열로 설정합니다.

  3. parserstatenew state로 설정합니다.

  4. parser토큰 인덱스skip만큼 증가시킵니다.

  5. parser컴포넌트 시작parser토큰 인덱스로 설정합니다.

  6. parser토큰 증가값을 0으로 설정합니다.

rewind생성자 문자열 파서 parser에 대해 실행하려면:
  1. parser토큰 인덱스parser컴포넌트 시작으로 설정합니다.

  2. parser토큰 증가값을 0으로 설정합니다.

rewind 및 상태 설정생성자 문자열 파서 parserstate state에 대해 실행하려면:
  1. rewindparser에 대해 실행합니다.

  2. parserstatestate로 설정합니다.

안전한 토큰 얻기생성자 문자열 파서 parser, 숫자 index에 대해 실행하려면:
  1. indexparser토큰 리스트 길이보다 작으면, parser토큰 리스트[index]를 반환합니다.

  2. 단언: parser토큰 리스트 길이가 1 이상임.

  3. last indexparser토큰 리스트 길이 − 1로 설정합니다.

  4. tokenparser토큰 리스트[last index]로 설정합니다.

  5. 단언: tokentype이 "end"임.

  6. token을 반환합니다.

특수하지 않은 패턴 문자 여부 판정생성자 문자열 파서 parser, 숫자 index, 문자열 value에 대해 실행하려면:
  1. token안전한 토큰 얻기parser, index로 실행한 결과로 설정합니다.

  2. tokenvaluevalue와 다르면 false 반환.

  3. 아래 중 하나라도 true이면:

    true 반환.

  4. false 반환.

프로토콜 접미사 여부 판정생성자 문자열 파서 parser에 대해 실행하려면:
  1. 특수하지 않은 패턴 문자 여부 판정parser, parsertoken index, ":"로 실행한 결과를 반환.

다음이 authority 슬래시 여부 판정생성자 문자열 파서 parser에 대해 실행하려면:
  1. 특수하지 않은 패턴 문자 여부 판정parser, parsertoken index + 1, "/"로 실행한 결과가 false면 false 반환.

  2. 특수하지 않은 패턴 문자 여부 판정parser, parsertoken index + 2, "/"로 실행한 결과가 false면 false 반환.

  3. true 반환.

identity 종결자 여부 판정생성자 문자열 파서 parser에 대해 실행하려면:
  1. 특수하지 않은 패턴 문자 여부 판정parser, parsertoken index, "@"로 실행한 결과를 반환.

패스워드 접두사 여부 판정생성자 문자열 파서 parser에 대해 실행하려면:
  1. 특수하지 않은 패턴 문자 여부 판정parser, parsertoken index, ":"로 실행한 결과를 반환.

포트 접두사 여부 판정생성자 문자열 파서 parser에 대해 실행하려면:
  1. 특수하지 않은 패턴 문자 여부 판정parser, parsertoken index, ":"로 실행한 결과를 반환.

pathname 시작 여부 판정생성자 문자열 파서 parser에 대해 실행하려면:
  1. 특수하지 않은 패턴 문자 여부 판정parser, parsertoken index, "/"로 실행한 결과를 반환.

search 접두사 여부 판정생성자 문자열 파서 parser에 대해 실행하려면:
  1. 특수하지 않은 패턴 문자 여부 판정parser, parsertoken index, "?"로 실행한 결과가 true면 true 반환.

  2. parser토큰 리스트[parsertoken index]의 value가 "?"가 아니면 false 반환.

  3. previous indexparsertoken index − 1로 설정합니다.

  4. previous index가 0 미만이면 true 반환.

  5. previous token안전한 토큰 얻기parser, previous index로 실행한 결과로 설정합니다.

  6. 아래 중 하나라도 true면 false 반환:

  7. true 반환.

hash 접두사 여부 판정생성자 문자열 파서 parser에 대해 실행하려면:
  1. 특수하지 않은 패턴 문자 여부 판정parser, parsertoken index, "#"로 실행한 결과를 반환.

그룹 open 여부 판정생성자 문자열 파서 parser에 대해 실행하려면:
  1. parser토큰 리스트[parsertoken index]의 type이 "open"이면 true 반환.

  2. 그 외에는 false 반환.

그룹 close 여부 판정생성자 문자열 파서 parser에 대해 실행하려면:
  1. parser토큰 리스트[parsertoken index]의 type이 "close"이면 true 반환.

  2. 그 외에는 false 반환.

IPv6 open 여부 판정생성자 문자열 파서 parser에 대해 실행하려면:
  1. 특수하지 않은 패턴 문자 여부 판정parser, parsertoken index, "["로 실행한 결과를 반환.

IPv6 close 여부 판정생성자 문자열 파서 parser에 대해 실행하려면:
  1. 특수하지 않은 패턴 문자 여부 판정parser, parsertoken index, "]"로 실행한 결과를 반환.

컴포넌트 문자열 생성생성자 문자열 파서 parser에 대해 실행하려면:
  1. 단언: parsertoken indexparser토큰 리스트 길이보다 작음.

  2. tokenparser토큰 리스트[parsertoken index]로 설정합니다.

  3. component start token안전한 토큰 얻기parser, parser컴포넌트 시작으로 실행한 결과로 설정합니다.

  4. component start input indexcomponent start tokenindex로 설정합니다.

  5. end indextokenindex로 설정합니다.

  6. parsercode point substringcomponent start input index부터 end index까지 input에서 추출하여 반환합니다.

프로토콜 특수 scheme 매칭 플래그 계산생성자 문자열 파서 parser에 대해 실행하려면:
  1. protocol string컴포넌트 문자열 생성parser에 대해 실행한 결과로 설정합니다.

  2. protocol component컴포넌트 컴파일protocol string, 프로토콜 정규화, 기본 옵션으로 실행한 결과로 설정합니다.

  3. protocol 컴포넌트가 특수 scheme과 매칭되는지protocol component에 대해 실행한 결과가 true면, parser프로토콜 특수 scheme 매칭 플래그를 true로 설정합니다.

2. 패턴 문자열

패턴 문자열은 일련의 대상 문자열 집합과 매칭하기 위해 작성된 문자열입니다. well formed 패턴 문자열은 특정 패턴 문법을 준수합니다. 이 패턴 문법은 인기 있는 path-to-regexp JavaScript 라이브러리의 문법을 직접 기반으로 합니다.

패턴 문자열은 파싱되어 part list를 생성할 수 있으며, 이 리스트는 패턴 문자열이 매칭되기 위해 컴포넌트 문자열에 어떤 내용이 어떤 순서로 등장해야 하는지를 설명합니다.

패턴 문자열은 캡처 그룹을 포함할 수 있으며, 기본적으로 가능한 가장 짧은 문자열을 매칭하며, 컴포넌트 구분자(/는 pathname, .는 hostname)까지 매칭합니다. 예를 들어, pathname 패턴 "/blog/:title"은 "/blog/hello-world"와 매칭되지만 "/blog/2012/02"와는 매칭되지 않습니다.

괄호로 둘러싼 정규표현식도 사용할 수 있으므로, pathname 패턴 "/blog/:year(\d+)/:month(\d+)"은 "/blog/2012/02"와 매칭됩니다.

그룹은 선택적이거나 반복될 수 있으며, 수정자를 사용해서 지정할 수 있습니다. 예를 들어, pathname 패턴 "/products/:id?"은 "/products"와 "/products/2" 모두와 매칭되지만 "/products/"와는 매칭되지 않습니다. pathname에서는 그룹이 자동으로 선행 /를 요구하므로, 이를 피하려면 그룹을 명시적으로 구분할 수 있습니다(예: pathname 패턴 "/products/{:id}?").

전체 와일드카드 *도 사용할 수 있으며, 가능한 한 많이 매칭합니다(예: pathname 패턴 "/products/*").

2.1. 패턴 문자열 파싱

2.1.1. 토큰

토큰 리스트리스트로, 0개 이상의 토큰 구조체를 포함합니다.

토큰구조체로, 패턴 문자열 내의 개별 렉시컬 토큰 하나를 나타냅니다.

토큰타입을 가지며, 문자열이고, 초기값은 "invalid-char"입니다. 다음 중 하나여야 합니다:

"open"
토큰이 U+007B({) 코드 포인트를 나타냅니다.
"close"
토큰이 U+007D(}) 코드 포인트를 나타냅니다.
"regexp"
토큰이 "(<정규표현식>)" 형태의 문자열을 나타냅니다. 정규표현식은 ASCII 코드 포인트만으로 구성되어야 합니다.
"name"
토큰이 ":<이름>" 형태의 문자열을 나타냅니다. name 값은 JavaScript 식별자에 부합하는 코드 포인트로 제한됩니다.
"char"
토큰이 특별한 문법적 의미가 없는 유효한 패턴 코드 포인트를 나타냅니다.
"escaped-char"
토큰이 백슬래시로 이스케이프된 코드 포인트("\<char>")를 나타냅니다.
"other-modifier"
토큰이 매칭 그룹 수정자로, U+003F(?) 또는 U+002B(+) 코드 포인트를 나타냅니다.
"asterisk"
토큰이 U+002A(*) 코드 포인트를 나타내며, 와일드카드 매칭 그룹 또는 매칭 그룹 수정자일 수 있습니다.
"end"
토큰패턴 문자열의 끝을 나타냅니다.
"invalid-char"
토큰이 패턴에서 유효하지 않은 코드 포인트를 나타냅니다. 이는 코드 포인트 값 자체가 원인일 수도 있고, 패턴 내의 다른 문법 요소와의 위치 때문에 발생할 수도 있습니다.

토큰index를 가지며, 숫자이고 초기값은 0입니다. 이는 토큰이 나타내는 패턴 문자열 내 첫 번째 코드 포인트의 위치입니다.

토큰value를 가지며, 문자열이고, 초기값은 빈 문자열입니다. 토큰이 나타내는 패턴 문자열의 코드 포인트를 포함합니다.

2.1.2. 토크나이즈

토크나이즈 정책은 문자열이며, 반드시 "strict" 또는 "lenient" 중 하나여야 합니다.

토크나이저구조체입니다.

토크나이저input을 가지며, 패턴 문자열이고, 초기값은 빈 문자열입니다.

토크나이저policy를 가지며, 토크나이즈 정책이고, 초기값은 "strict"입니다.

토크나이저토큰 리스트를 가지며, 토큰 리스트이고, 초기값은 빈 리스트입니다.

토크나이저index를 가지며, 숫자이고, 초기값은 0입니다.

토크나이저next index를 가지며, 숫자이고, 초기값은 0입니다.

토크나이저code point를 가지며, 유니코드 코드 포인트이고, 초기값은 null입니다.

토크나이즈를 문자열 input토크나이즈 정책 policy에 대해 실행하려면:
  1. tokenizer를 새 토크나이저로 생성합니다.

  2. tokenizerinputinput으로 설정합니다.

  3. tokenizerpolicypolicy로 설정합니다.

  4. tokenizerindextokenizerinputcode point length보다 작은 동안:

    1. seek and get the next code pointtokenizertokenizerindex로 실행합니다.

    2. tokenizercode point가 U+002A(*)이면:

      1. 기본 위치 및 길이로 토큰 추가tokenizer와 "asterisk"로 실행합니다.

      2. Continue.

    3. tokenizercode point가 U+002B(+) 또는 U+003F(?)이면:

      1. 기본 위치 및 길이로 토큰 추가tokenizer와 "other-modifier"로 실행합니다.

      2. Continue.

    4. tokenizercode point가 U+005C(\)이면:

      1. tokenizerindextokenizerinputcode point length − 1과 같으면:

        1. 토크나이즈 에러 처리tokenizer, tokenizernext index, tokenizerindex로 실행합니다.

        2. Continue.

      2. escaped indextokenizernext index로 설정합니다.

      3. get the next code pointtokenizer로 실행합니다.

      4. 기본 길이로 토큰 추가tokenizer, "escaped-char", tokenizernext index, escaped index로 실행합니다.

      5. Continue.

    5. tokenizercode point가 U+007B({)이면:

      1. 기본 위치 및 길이로 토큰 추가tokenizer와 "open"로 실행합니다.

      2. Continue.

    6. tokenizercode point가 U+007D(})이면:

      1. 기본 위치 및 길이로 토큰 추가tokenizer와 "close"로 실행합니다.

      2. Continue.

    7. tokenizercode point가 U+003A(:)이면:

      1. name positiontokenizernext index로 설정합니다.

      2. name startname position으로 설정합니다.

      3. name positiontokenizerinputcode point length보다 작은 동안:

        1. seek and get the next code pointtokenizername position으로 실행합니다.

        2. first code pointname positionname start와 같으면 true, 아니면 false로 설정합니다.

        3. valid code point유효한 이름 코드 포인트 여부 판정tokenizercode point, first code point로 실행한 결과로 설정합니다.

        4. valid code point가 false이면 break.

        5. name positiontokenizernext index로 설정합니다.

      4. name positionname start 이하이면:

        1. 토크나이즈 에러 처리tokenizer, name start, tokenizerindex로 실행합니다.

        2. Continue.

      5. 기본 길이로 토큰 추가tokenizer, "name", name position, name start로 실행합니다.

      6. Continue.

    8. tokenizercode point가 U+0028(()이면:

      1. depth를 1로 설정합니다.

      2. regexp positiontokenizernext index로 설정합니다.

      3. regexp startregexp position으로 설정합니다.

      4. error를 false로 설정합니다.

      5. regexp positiontokenizerinputcode point length보다 작은 동안:

        1. seek and get the next code pointtokenizerregexp position으로 실행합니다.

        2. tokenizercode pointASCII 코드 포인트가 아니면:

          1. 토크나이즈 에러 처리tokenizer, regexp start, tokenizerindex로 실행합니다.

          2. error를 true로 설정합니다.

          3. Break.

        3. regexp positionregexp start와 같고 tokenizercode point가 U+003F(?)이면:

          1. 토크나이즈 에러 처리tokenizer, regexp start, tokenizerindex로 실행합니다.

          2. error를 true로 설정합니다.

          3. Break.

        4. tokenizercode point가 U+005C(\)이면:

          1. regexp positiontokenizerinputcode point length − 1과 같으면:

            1. 토크나이즈 에러 처리tokenizer, regexp start, tokenizerindex로 실행합니다.

            2. error를 true로 설정합니다.

            3. Break

          2. get the next code pointtokenizer로 실행합니다.

          3. tokenizercode pointASCII 코드 포인트가 아니면:

            1. 토크나이즈 에러 처리tokenizer, regexp start, tokenizerindex로 실행합니다.

            2. error를 true로 설정합니다.

            3. Break.

          4. regexp positiontokenizernext index로 설정합니다.

          5. Continue.

        5. tokenizercode point가 U+0029())이면:

          1. depth를 1 감소시킵니다.

          2. depth가 0이면:

            1. regexp positiontokenizernext index로 설정합니다.

            2. Break.

        6. 그 외 tokenizercode point가 U+0028(()이면:

          1. depth를 1 증가시킵니다.

          2. regexp positiontokenizerinputcode point length − 1과 같으면:

            1. process a tokenizing errortokenizer, regexp start, tokenizerindex로 실행합니다.

            2. error를 true로 설정합니다.

            3. Break

          3. temporary positiontokenizernext index로 설정합니다.

          4. get the next code pointtokenizer로 실행합니다.

          5. tokenizercode point가 U+003F(?)가 아니면:

            1. 토크나이즈 에러 처리tokenizer, regexp start, tokenizerindex로 실행합니다.

            2. error를 true로 설정합니다.

            3. Break.

          6. tokenizernext indextemporary position으로 설정합니다.

        7. regexp positiontokenizernext index로 설정합니다.

      6. error가 true면 continue.

      7. depth가 0이 아니면:

        1. 토크나이즈 에러 처리tokenizer, regexp start, tokenizerindex로 실행합니다.

        2. Continue.

      8. regexp lengthregexp positionregexp start − 1로 설정합니다.

      9. regexp length가 0이면:

        1. 토크나이즈 에러 처리tokenizer, regexp start, tokenizerindex로 실행합니다.

        2. Continue.

      10. 토큰 추가tokenizer, "regexp", regexp position, regexp start, regexp length로 실행합니다.

      11. Continue.

    9. 기본 위치 및 길이로 토큰 추가tokenizer와 "char"로 실행합니다.

  5. 기본 길이로 토큰 추가tokenizer, "end", tokenizerindex, tokenizerindex로 실행합니다.

  6. tokenizer토큰 리스트를 반환합니다.

다음 코드 포인트 가져오기토크나이저 tokenizer에 대해 실행하려면:
  1. tokenizercode pointtokenizerinput에서 tokenizernext index 위치에 있는 유니코드 코드 포인트로 설정합니다.

  2. tokenizernext index를 1 증가시킵니다.

seek 후 다음 코드 포인트 가져오기토크나이저 tokenizer와 숫자 index에 대해 실행하려면:
  1. tokenizernext indexindex로 설정합니다.

  2. 다음 코드 포인트 가져오기tokenizer로 실행합니다.

토큰 추가토크나이저 tokenizer, type type, 숫자 next position, 숫자 value position, 숫자 value length에 대해 실행하려면:
  1. token을 새 토큰으로 생성합니다.

  2. tokentypetype으로 설정합니다.

  3. tokenindextokenizerindex로 설정합니다.

  4. tokenvaluecode point substringvalue position부터 value length만큼 tokenizerinput에서 추출한 값으로 설정합니다.

  5. Append를 사용해 tokentokenizer토큰 리스트 끝에 추가합니다.

  6. tokenizerindexnext position으로 설정합니다.

기본 길이로 토큰 추가토크나이저 tokenizer, type type, 숫자 next position, 숫자 value position에 대해 실행하려면:
  1. computed lengthnext positionvalue position으로 설정합니다.

  2. 토큰 추가tokenizer, type, next position, value position, computed length로 실행합니다.

기본 위치 및 길이로 토큰 추가토크나이저 tokenizer, type type에 대해 실행하려면:
  1. 기본 길이로 토큰 추가tokenizer, type, tokenizernext index, tokenizerindex로 실행합니다.

토크나이즈 에러 처리토크나이저 tokenizer, 숫자 next position, 숫자 value position에 대해 실행하려면:
  1. tokenizerpolicy가 "strict"이면 TypeError를 throw합니다.

  2. 단언: tokenizerpolicy가 "lenient"임을 보장합니다.

  3. 기본 길이로 토큰 추가tokenizer, "invalid-char", next position, value position로 실행합니다.

유효한 이름 코드 포인트 여부 판정을 유니코드 code point, boolean first에 대해 실행하려면:
  1. first가 true라면, code pointIdentifierStart 코드 포인트 집합에 포함되어 있는지 검사한 결과를 반환합니다.

  2. 그 외에는 code pointIdentifierPart 코드 포인트 집합에 포함되어 있는지 검사한 결과를 반환합니다.

2.1.3. 부분

부분 리스트리스트로, 0개 이상의 부분을 포함합니다.

부분구조체로, 파서의 패턴 문자열의 한 조각을 나타냅니다. 최대 하나의 매칭 그룹, 고정 텍스트 접두사, 고정 텍스트 접미사, 수정자를 포함할 수 있습니다. 최소로는 하나의 고정 텍스트 문자열 또는 하나의 매칭 그룹만을 가질 수 있습니다.

부분타입을 가지며, 문자열로 반드시 생성 시 설정해야 합니다. 다음 중 하나여야 합니다:

"fixed-text"
부분이 단순 고정 텍스트 문자열을 나타냅니다.
"regexp"
부분이 커스텀 정규표현식이 있는 매칭 그룹을 나타냅니다.
"segment-wildcard"
부분이 다음 분리자 코드 포인트까지 매칭하는 매칭 그룹을 나타냅니다. 보통 커스텀 정규표현식이 없는 ":foo"와 같은 이름 그룹에 사용됩니다.
"full-wildcard"
부분이 모든 코드 포인트를 탐욕적으로 매칭하는 매칭 그룹을 나타냅니다. 보통 "*" 와일드카드 매칭 그룹에 사용됩니다.

부분을 가지며, 문자열로 반드시 생성 시 설정해야 합니다.

부분수정자를 가지며, 문자열로 반드시 생성 시 설정해야 합니다. 다음 중 하나여야 합니다:

"none"
부분수정자가 없습니다.
"optional"
부분은 U+003F(?) 코드 포인트로 표시되는 선택적 수정자를 가집니다.
"zero-or-more"
부분은 U+002A(*) 코드 포인트로 표시되는 "zero or more" 수정자를 가집니다.
"one-or-more"
부분은 U+002B(+) 코드 포인트로 표시되는 "one or more" 수정자를 가집니다.

부분이름을 가지며, 문자열로 초기값은 빈 문자열입니다.

부분접두사를 가지며, 문자열로 초기값은 빈 문자열입니다.

부분접미사를 가지며, 문자열로 초기값은 빈 문자열입니다.

2.1.4. 옵션

옵션 구조체패턴 문자열의 동작을 제어하는 다양한 설정을 포함합니다. 이 옵션들은 원래 path-to-regexp에서 유래되었습니다. URLPattern 명세에서 변경되는 옵션만 포함하며, 그 외의 옵션은 제외합니다. 비교 목적으로, 이 명세는 path-to-regexp에서 strict, start, end가 항상 false로 설정된 것과 같습니다.

옵션구분자 코드 포인트를 가지며, 문자열로 반드시 생성 시 설정해야 합니다. 1개의 ASCII 코드 포인트 또는 빈 문자열이어야 합니다. 이 코드 포인트는 세그먼트 구분자로 처리되며, 기본적으로 :foo 이름 그룹이 어디까지 매칭되는지 결정하는 데 사용됩니다. 예를 들어, 구분자 코드 포인트가 "/"이면 "/:foo"는 "/bar"와 매칭되지만, "/bar/baz"와는 매칭되지 않습니다. 구분자 코드 포인트가 빈 문자열이면 두 예제 패턴 모두와 매칭됩니다.

옵션접두사 코드 포인트를 가지며, 문자열로 반드시 생성 시 설정해야 합니다. 1개의 ASCII 코드 포인트 또는 빈 문자열이어야 합니다. 이 코드 포인트는 매칭 그룹 바로 앞에 있으면 자동 접두사로 처리됩니다. 이는 매칭 그룹이 선택적이거나 반복적으로 변경될 때 중요합니다. 예를 들어, 접두사 코드 포인트가 "/"이면 "/foo/:bar?/baz"에서 ":bar" 앞의 "/"가 접두사로 처리되어 이름 그룹과 함께 선택적으로 됩니다. 그래서 이 패턴은 "/foo/baz"와 매칭됩니다.

옵션대소문자 무시를 가지며, boolean 타입으로 반드시 생성 시 설정해야 합니다. 기본값은 false입니다. true 또는 false로 설정하면 각각 대소문자 구분, 대소문자 무시 매칭이 활성화됩니다. 비교 목적으로, 이 케이스는 path-to-regexpsensitive 옵션의 부정값처럼 생각할 수 있습니다.

2.1.5. 파싱

인코딩 콜백은 주어진 문자열 input을 받는 추상 알고리즘입니다. input패턴 문자열의 간단한 텍스트 조각입니다. 구현 알고리즘은 input을 검증 및 인코딩합니다. 반드시 인코딩된 문자열을 반환하거나 예외를 던져야 합니다.

패턴 파서구조체입니다.

패턴 파서토큰 리스트를 가지며, 토큰 리스트이고, 초기값은 빈 리스트입니다.

패턴 파서인코딩 콜백을 가지며, 인코딩 콜백이고 반드시 생성 시 설정해야 합니다.

패턴 파서세그먼트 와일드카드 정규표현식을 가지며, 문자열이고 반드시 생성 시 설정해야 합니다.

패턴 파서부분 리스트를 가지며, 부분 리스트이고, 초기값은 빈 리스트입니다.

패턴 파서대기 중 고정 값을 가지며, 문자열이고 초기값은 빈 문자열입니다.

패턴 파서인덱스를 가지며, 숫자로 초기값은 0입니다.

패턴 파서다음 숫자 이름을 가지며, 숫자로 초기값은 0입니다.

패턴 문자열 파싱패턴 문자열 input, 옵션 options, 인코딩 콜백 encoding callback에 대해 실행하려면:
  1. parser를 새 패턴 파서로 생성합니다. 인코딩 콜백encoding callback, 세그먼트 와일드카드 정규표현식세그먼트 와일드카드 정규표현식 생성options로 실행한 결과입니다.

  2. parser토큰 리스트토크나이즈input, "strict"로 실행한 결과로 설정합니다.

  3. parser인덱스parser토큰 리스트 길이보다 작은 동안:

    이 첫 번째 구간은 <접두사 문자><이름><정규표현식><수정자> 시퀀스를 찾습니다. 0개부터 전부 있을 수 있습니다.

    "/:foo(bar)?"
    모든 토큰.
    "/"
    하나의 "char" 토큰.
    ":foo"
    하나의 "name" 토큰.
    "(bar)"
    하나의 "regexp" 토큰.
    "/:foo"
    "char"와 "name" 토큰.
    "/(bar)"
    "char"와 "regexp" 토큰.
    "/:foo?"
    "char", "name", 그리고 "other-modifier" 토큰.
    "/(bar)?"
    "char", "regexp", 그리고 "other-modifier" 토큰.
    1. char token토큰 소모 시도parser, "char"로 실행한 결과로 설정합니다.

    2. name token토큰 소모 시도parser, "name"로 실행한 결과로 설정합니다.

    3. regexp or wildcard token정규표현식 또는 와일드카드 토큰 소모 시도parser, name token으로 실행한 결과로 설정합니다.

    4. name token이 null이 아니거나 regexp or wildcard token이 null이 아니면:

      매칭 그룹이 있다면 즉시 부분을 추가해야 합니다.

      1. prefix를 빈 문자열로 설정합니다.

      2. char token이 null이 아니면 prefixchar tokenvalue로 설정합니다.

      3. prefix가 빈 문자열이 아니고 options접두사 코드 포인트가 아니면:

        1. prefixparser대기 중 고정 값 끝에 추가합니다.

        2. prefix를 빈 문자열로 설정합니다.

      4. 대기 중 고정 값에서 부분 추가 시도parser로 실행합니다.

      5. modifier token수정자 토큰 소모 시도parser로 실행한 결과로 설정합니다.

      6. 부분 추가parser, prefix, name token, regexp or wildcard token, 빈 문자열, modifier token으로 실행합니다.

      7. Continue.

    5. fixed tokenchar token으로 설정합니다.

      매칭 그룹이 없었다면 고정 텍스트를 버퍼링해야 합니다. 가능한 한 많은 텍스트를 모아서 "fixed-text" 부분으로 추가하기 원합니다.

    6. fixed token이 null이면 fixed token토큰 소모 시도parser, "escaped-char"로 실행한 결과로 설정합니다.

    7. fixed token이 null이 아니면:

      1. fixed tokenvalueparser대기 중 고정 값에 추가합니다.

      2. Continue.

    8. open token토큰 소모 시도parser, "open"로 실행한 결과로 설정합니다.

      다음으로 <open><char prefix><name><regexp><char suffix><close><modifier> 시퀀스를 찾습니다. open과 close는 필수이며, 나머지 토큰은 없어도 됩니다.

      "{a:foo(bar)b}?"
      모든 토큰이 존재합니다.
      "{:foo}?"
      "open", "name", "close", "other-modifier" 토큰.
      "{(bar)}?"
      "open", "regexp", "close", "other-modifier" 토큰.
      "{ab}?"
      "open", "char", "close", "other-modifier" 토큰.
    9. open token이 null이 아니면:

      1. prefix텍스트 소비parser로 실행한 결과로 설정합니다.

      2. name token토큰 소모 시도parser, "name"로 실행한 결과로 설정합니다.

      3. regexp or wildcard token정규표현식 또는 와일드카드 토큰 소모 시도parser, name token으로 실행한 결과로 설정합니다.

      4. suffix텍스트 소비parser로 실행한 결과로 설정합니다.

      5. 필수 토큰 소비parser, "close"로 실행합니다.

      6. modifier token수정자 토큰 소모 시도parser로 실행한 결과로 설정합니다.

      7. 부분 추가parser, prefix, name token, regexp or wildcard token, suffix, modifier token으로 실행합니다.

      8. Continue.

    10. 대기 중 고정 값에서 부분 추가 시도parser로 실행합니다.

    11. 필수 토큰 소비parser, "end"로 실행합니다.

  4. parser부분 리스트를 반환합니다.

전체 와일드카드 정규식 값은 문자열 ".*"입니다.

세그먼트 와일드카드 정규식 생성옵션 options에 대해 실행하려면:
  1. result를 "[^"로 설정합니다.

  2. optionsdelimiter code point에 대해 정규식 문자열 이스케이프를 실행한 결과를 result 끝에 추가합니다.

  3. "]+?"를 result 끝에 추가합니다.

  4. result를 반환합니다.

토큰 소모 시도패턴 파서 parser, type type에 대해 실행하려면:
  1. 단언: parserindexparsertoken list 길이보다 작음.

  2. next tokenparsertoken list[parserindex]로 설정합니다.

  3. next tokentypetype이 아니면 null 반환.

  4. parserindex를 1 증가시킵니다.

  5. next token을 반환합니다.

수정자 토큰 소모 시도패턴 파서 parser에 대해 실행하려면:
  1. token토큰 소모 시도parser, "other-modifier"로 실행한 결과로 설정합니다.

  2. token이 null이 아니면 token을 반환합니다.

  3. token토큰 소모 시도parser, "asterisk"로 실행한 결과로 설정합니다.

  4. token을 반환합니다.

정규표현식 또는 와일드카드 토큰 소모 시도패턴 파서 parser, token name token에 대해 실행하려면:
  1. token토큰 소모 시도parser, "regexp"로 실행한 결과로 설정합니다.

  2. name token이 null이고 token도 null이면, token토큰 소모 시도parser, "asterisk"로 실행한 결과로 설정합니다.

  3. token을 반환합니다.

필수 토큰 소비패턴 파서 parser, type type에 대해 실행하려면:
  1. result토큰 소모 시도parser, type으로 실행한 결과로 설정합니다.

  2. result가 null이면 TypeError를 throw합니다.

  3. result를 반환합니다.

텍스트 소비패턴 파서 parser에 대해 실행하려면:
  1. result를 빈 문자열로 설정합니다.

  2. 무한 반복:

    1. token토큰 소모 시도parser, "char"로 실행한 결과로 설정합니다.

    2. token이 null이면, token토큰 소모 시도parser, "escaped-char"로 실행한 결과로 설정합니다.

    3. token이 null이면 break.

    4. tokenvalueresult 끝에 추가합니다.

  3. result를 반환합니다.

대기 중 고정 값에서 부분 추가 시도패턴 파서 parser에 대해 실행하려면:
  1. parser대기 중 고정 값이 빈 문자열이면 반환.

  2. encoded valueparser인코딩 콜백parser대기 중 고정 값에 대해 실행한 결과로 설정합니다.

  3. parser대기 중 고정 값을 빈 문자열로 설정합니다.

  4. part를 새 부분으로 생성합니다. type은 "fixed-text", valueencoded value, modifier는 "none"입니다.

  5. Append partparser부분 리스트 끝에 추가합니다.

부분 추가패턴 파서 parser, 문자열 prefix, token name token, token regexp or wildcard token, 문자열 suffix, token modifier token에 대해 실행하려면:
  1. modifier를 "none"로 설정합니다.

  2. modifier token이 null이 아니면:

    1. modifier tokenvalue가 "?"이면 modifier를 "optional"로 설정합니다.

    2. 그 외 modifier tokenvalue가 "*"이면 modifier를 "zero-or-more"로 설정합니다.

    3. 그 외 modifier tokenvalue가 "+"이면 modifier를 "one-or-more"로 설정합니다.

  3. name token이 null이고 regexp or wildcard token도 null이고 modifier가 "none"이면:

    이 경우는 "{foo}" 그룹입니다. 대기 중 고정 값에 추가하여 이전/이후 텍스트와 결합될 수 있도록 합니다.

    1. prefixparser대기 중 고정 값 끝에 추가합니다.

    2. 반환합니다.

  4. 대기 중 고정 값에서 부분 추가 시도parser로 실행합니다.

  5. name token이 null이고 regexp or wildcard token도 null이면:

    이 경우는 "{foo}?" 그룹입니다. modifier가 있으므로 다른 텍스트와 결합할 수 없습니다. 즉시 부분으로 추가합니다.

    1. 단언: suffix가 빈 문자열임을 보장합니다.

    2. prefix가 빈 문자열이면 반환합니다.

    3. encoded valueparser인코딩 콜백prefix에 대해 실행한 결과로 설정합니다.

    4. part를 새 부분으로 생성합니다. type은 "fixed-text", valueencoded value, modifiermodifier입니다.

    5. Append partparser부분 리스트 끝에 추가합니다.

    6. 반환합니다.

  6. regexp value를 빈 문자열로 설정합니다.

    다음은 regexp or wildcard token을 정규표현식으로 변환합니다.

  7. regexp or wildcard token이 null이면 regexp valueparser세그먼트 와일드카드 정규식으로 설정합니다.

  8. 그 외 regexp or wildcard tokentype이 "asterisk"이면 regexp value전체 와일드카드 정규식 값으로 설정합니다.

  9. 그 외에는 regexp valueregexp or wildcard tokenvalue로 설정합니다.

  10. type을 "regexp"로 설정합니다.

    다음은 regexp value부분 type으로 변환합니다. 정규표현식으로 먼저 변환하여 "regexp" token이 "name" 또는 "asterisk" token과 동일하게 처리되도록 합니다.

  11. regexp valueparser세그먼트 와일드카드 정규식과 같으면:

    1. type을 "segment-wildcard"로 설정합니다.

    2. regexp value를 빈 문자열로 설정합니다.

  12. 그 외 regexp value전체 와일드카드 정규식 값과 같으면:

    1. type을 "full-wildcard"로 설정합니다.

    2. regexp value를 빈 문자열로 설정합니다.

  13. name을 빈 문자열로 설정합니다.

    다음은 부분 이름을 결정합니다. 이는 "name" token으로 명시적으로 제공되거나 자동으로 할당될 수 있습니다.

  14. name token이 null이 아니면 namename tokenvalue로 설정합니다.

  15. 그 외 regexp or wildcard token이 null이 아니면:

    1. nameparser다음 숫자 이름serialize한 값으로 설정합니다.

    2. parser다음 숫자 이름을 1 증가시킵니다.

  16. 중복 이름 여부 판정parser, name으로 실행한 결과가 true면 TypeError를 throw합니다.

  17. encoded prefixparser인코딩 콜백prefix에 대해 실행한 결과로 설정합니다.

    마지막으로, 고정 텍스트 값을 인코딩하고 부분을 생성합니다.

  18. encoded suffixparser인코딩 콜백suffix에 대해 실행한 결과로 설정합니다.

  19. part를 새 부분으로 생성합니다. typetype, valueregexp value, modifiermodifier, namename, prefixencoded prefix, suffixencoded suffix입니다.

  20. Append partparser부분 리스트 끝에 추가합니다.

중복 이름 여부 판정패턴 파서 parser, 문자열 name에 대해 실행하려면:
  1. parser부분 리스트part에 대해:

    1. partnamename과 같으면 true 반환.

  2. false 반환.

2.2. 부분 리스트를 정규표현식으로 변환하기

정규표현식 및 이름 리스트 생성부분 리스트 part list옵션 options에서 실행하려면:
  1. result를 "^"로 설정합니다.

  2. name list를 새 리스트로 생성합니다.

  3. partpart list에서 반복합니다:

    1. parttype이 "fixed-text"이면:

      1. partmodifier가 "none"이면, 정규식 문자열 이스케이프partvalue에 대해 실행한 결과를 result 끝에 추가합니다.

      2. 그 외에는:

        "fixed-text" part에 modifier가 있으면 비캡처 그룹을 사용합니다. 아래 형태를 사용합니다.

        (?:<고정 텍스트>)<modifier>

        1. "(?:"를 result 끝에 추가합니다.

        2. 정규식 문자열 이스케이프partvalue에 대해 실행한 결과를 result 끝에 추가합니다.

        3. ")"를 result 끝에 추가합니다.

        4. modifier를 문자열로 변환partmodifier로 실행한 결과를 result 끝에 추가합니다.

      3. Continue.

    2. 단언: partname이 빈 문자열이 아님을 보장합니다.

    3. Append를 사용해 partnamename list 끝에 추가합니다.

      매칭 그룹 이름을 병렬 리스트로 수집합니다. 이는 대부분 path-to-regexp와의 레거시 호환성을 위한 것입니다. 정규표현식의 named capture group으로 전환할 수도 있지만, 알고리즘의 복잡성 때문에 의도치 않은 버그가 발생할 위험이 있습니다. 또한, 생성된 정규표현식을 웹에 노출할 경우 path-to-regexp와의 호환성을 유지하는 것이 중요합니다.

    4. regexp valuepartvalue로 설정합니다.

    5. parttype이 "segment-wildcard"이면 regexp value세그먼트 와일드카드 정규식 생성options로 실행한 결과로 설정합니다.

    6. 그 외 parttype이 "full-wildcard"이면 regexp value전체 와일드카드 정규식 값으로 설정합니다.

    7. partprefixpartsuffix가 모두 빈 문자열이면:

      prefix나 suffix가 없으면 modifier에 따라 생성 방식이 달라집니다. modifier가 없거나 optional만 있을 때는 아래와 같은 간단한 형태를 사용합니다:

      (<regexp value>)<modifier>

      반복 modifier가 있으면 더 복잡한 형태를 사용합니다:

      ((?:<regexp value>)<modifier>)

      1. partmodifier가 "none" 또는 "optional"이면:

        1. "("를 result 끝에 추가합니다.

        2. regexp valueresult 끝에 추가합니다.

        3. ")"를 result 끝에 추가합니다.

        4. modifier를 문자열로 변환partmodifier로 실행한 결과를 result 끝에 추가합니다.

      2. 그 외에는:

        1. "((?:"를 result 끝에 추가합니다.

        2. regexp valueresult 끝에 추가합니다.

        3. ")"를 result 끝에 추가합니다.

        4. modifier를 문자열로 변환partmodifier로 실행한 결과를 result 끝에 추가합니다.

        5. ")"를 result 끝에 추가합니다.

      3. Continue.

    8. partmodifier가 "none" 또는 "optional"이면:

      이 부분은 prefixsuffix가 있는 반복되지 않는 부분을 처리합니다. 내부 캡처 그룹이 주 regexp value를 포함하고, 그 그룹은 prefix/suffix와 비캡처 그룹으로 결합됩니다. 마지막으로 modifier가 적용됩니다. 아래 형태입니다.

      (?:<prefix>(<regexp value>)<suffix>)<modifier>

      1. "(?:"를 result 끝에 추가합니다.

      2. 정규식 문자열 이스케이프partprefix에 대해 실행한 결과를 result 끝에 추가합니다.

      3. "("를 result 끝에 추가합니다.

      4. regexp valueresult 끝에 추가합니다.

      5. ")"를 result 끝에 추가합니다.

      6. 정규식 문자열 이스케이프partsuffix에 대해 실행한 결과를 result 끝에 추가합니다.

      7. ")"를 result 끝에 추가합니다.

      8. modifier를 문자열로 변환partmodifier로 실행한 결과를 result 끝에 추가합니다.

      9. Continue.

    9. 단언: partmodifier가 "zero-or-more" 또는 "one-or-more"임을 보장합니다.

    10. 단언: partprefix가 빈 문자열이 아니거나 partsuffix가 빈 문자열이 아니어야 합니다.

      prefix나 suffix가 있는 반복 부분은 매우 복잡합니다. 최초 prefix와 마지막 suffix를 제외하고 반복 요소 사이에는 포함됩니다. 이를 위해, prefix를 제외한 초기 표현식을 따로 두고, prefix/suffix가 포함된 표현을 반복적으로 추가합니다. zero 값이 허용되면 마지막에 optional modifier를 추가할 수 있습니다. 아래 형태입니다.

      (?:<prefix>((?:<regexp value>)(?:<suffix><prefix>(?:<regexp value>))*)<suffix>)?

    11. "(?:"를 result 끝에 추가합니다.

    12. 정규식 문자열 이스케이프partprefix에 대해 실행한 결과를 result 끝에 추가합니다.

    13. "((?:"를 result 끝에 추가합니다.

    14. regexp valueresult 끝에 추가합니다.

    15. ")(?:"를 result 끝에 추가합니다.

    16. 정규식 문자열 이스케이프partsuffix에 대해 실행한 결과를 result 끝에 추가합니다.

    17. 정규식 문자열 이스케이프partprefix에 대해 실행한 결과를 result 끝에 추가합니다.

    18. "(?:"를 result 끝에 추가합니다.

    19. regexp valueresult 끝에 추가합니다.

    20. "))*)"를 result 끝에 추가합니다.

    21. 정규식 문자열 이스케이프partsuffix에 대해 실행한 결과를 result 끝에 추가합니다.

    22. ")"를 result 끝에 추가합니다.

    23. partmodifier가 "zero-or-more"이면, "?"를 result 끝에 추가합니다.

  4. "$"를 result 끝에 추가합니다.

  5. (result, name list)를 반환합니다.

정규식 문자열 이스케이프를 문자열 input에 대해 실행하려면:
  1. 단언: inputASCII 문자열임을 보장합니다.

  2. result를 빈 문자열로 설정합니다.

  3. index를 0으로 설정합니다.

  4. indexinput길이보다 작은 동안:

    1. cinput[index]로 설정합니다.

    2. index를 1 증가시킵니다.

    3. c가 아래 중 하나면:

      • U+002E (.);
      • U+002B (+);
      • U+002A (*);
      • U+003F (?);
      • U+005E (^);
      • U+0024 ($);
      • U+007B ({);
      • U+007D (});
      • U+0028 (();
      • U+0029 ());
      • U+005B ([);
      • U+005D (]);
      • U+007C (|);
      • U+002F (/); 또는
      • U+005C (\),

      그 경우 "\"를 result 끝에 추가합니다.

    4. cresult 끝에 추가합니다.

  5. result를 반환합니다.

2.3. 부분 리스트를 패턴 문자열로 변환하기

패턴 문자열 생성부분 리스트 part list옵션 options에서 실행하려면:
  1. result를 빈 문자열로 설정합니다.

  2. index list인덱스 얻기part list에 대해 실행한 결과로 설정합니다.

  3. indexindex list에서 반복:

    1. partpart list[index]로 설정합니다.

    2. previous partindex가 0보다 크면 part list[index - 1], 아니면 null로 설정합니다.

    3. next partindexindex list길이 - 1보다 작으면 part list[index + 1], 아니면 null로 설정합니다.

    4. parttype이 "fixed-text"이면:

      1. partmodifier가 "none"이면:

        1. 패턴 문자열 이스케이프partvalue에 대해 실행한 결과를 result 끝에 추가합니다.

        2. Continue.

      2. "{"를 result 끝에 추가합니다.

      3. 패턴 문자열 이스케이프partvalue에 대해 실행한 결과를 result 끝에 추가합니다.

      4. "}"를 result 끝에 추가합니다.

      5. modifier를 문자열로 변환partmodifier로 실행한 결과를 result 끝에 추가합니다.

      6. Continue.

    5. custom namepartname[0]이 ASCII digit이 아니면 true, 아니면 false로 설정합니다.

    6. needs grouping을 아래 중 하나라도 true면 true, 아니면 false로 설정합니다:

    7. 아래 모두 true이면:

      그러면:
      1. next parttype이 "fixed-text"이면:

        1. 유효한 이름 코드 포인트 여부 판정next partvalue의 첫 코드 포인트, 불린값 false로 실행한 결과가 true면 needs grouping을 true로 설정합니다.

      2. 그 외에는:

        1. next partname[0]이 ASCII digit이면 needs grouping을 true로 설정합니다.

    8. 아래 모두 true이면:

      그러면 needs grouping을 true로 설정합니다.
    9. 단언: partname이 빈 문자열 또는 null이 아님을 보장합니다.

    10. needs grouping이 true면 "{"를 result 끝에 추가합니다.

    11. 패턴 문자열 이스케이프partprefix에 대해 실행한 결과를 result 끝에 추가합니다.

    12. custom name이 true면:

      1. ":"를 result 끝에 추가합니다.

      2. partnameresult 끝에 추가합니다.

    13. parttype이 "regexp"이면:

      1. "("를 result 끝에 추가합니다.

      2. partvalueresult 끝에 추가합니다.

      3. ")"를 result 끝에 추가합니다.

    14. 그 외 parttype이 "segment-wildcard"이고 custom name이 false이면:

      1. "("를 result 끝에 추가합니다.

      2. 세그먼트 와일드카드 정규식 생성options로 실행한 결과를 result 끝에 추가합니다.

      3. ")"를 result 끝에 추가합니다.

    15. 그 외 parttype이 "full-wildcard"이면:

      1. custom name이 false이고 아래 중 하나라도 true이면:

        • previous part가 null임
        • previous parttype이 "fixed-text"
        • previous partmodifier가 "none"가 아님
        • needs grouping이 true
        • partprefix가 빈 문자열이 아님
        그러면 "*"를 result 끝에 추가합니다.
      2. 그 외에는:

        1. "("를 result 끝에 추가합니다.

        2. 전체 와일드카드 정규식 값result 끝에 추가합니다.

        3. ")"를 result 끝에 추가합니다.

    16. 아래 모두 true이면:

      그러면 U+005C (\)를 result 끝에 추가합니다.
    17. 패턴 문자열 이스케이프partsuffix에 대해 실행한 결과를 result 끝에 추가합니다.

    18. needs grouping이 true이면 "}"를 result 끝에 추가합니다.

    19. modifier를 문자열로 변환partmodifier로 실행한 결과를 result 끝에 추가합니다.

  4. result를 반환합니다.

패턴 문자열 이스케이프를 문자열 input에 대해 실행하려면:
  1. 단언: inputASCII 문자열임을 보장합니다.

  2. result를 빈 문자열로 설정합니다.

  3. index를 0으로 설정합니다.

  4. indexinput길이보다 작은 동안:

    1. cinput[index]로 설정합니다.

    2. index를 1 증가시킵니다.

    3. c가 아래 중 하나면:

      • U+002B (+);
      • U+002A (*);
      • U+003F (?);
      • U+003A (:);
      • U+007B ({);
      • U+007D (});
      • U+0028 (();
      • U+0029 ());
      • U+005C (\)

      그 경우 U+005C (\)를 result 끝에 추가합니다.

    4. cresult 끝에 추가합니다.

  5. result를 반환합니다.

modifier를 문자열로 변환modifier modifier에 대해 실행하려면:
  1. modifier가 "zero-or-more"이면 "*" 반환.

  2. modifier가 "optional"이면 "?" 반환.

  3. modifier가 "one-or-more"이면 "+" 반환.

  4. 빈 문자열 반환.

3. 정규화(Canonicalization)

3.1. 인코딩 콜백(Encoding callbacks)

프로토콜 정규화를 문자열 value에 대해 실행하려면:
  1. value가 빈 문자열이면 value를 반환합니다.

  2. parseResult기본 URL 파서value + "://dummy.invalid/"로 실행한 결과로 설정합니다.

    참고: state override는 여기서 사용하지 않습니다. 해당 기능은 protocol setter에만 적합한 제한을 강제하기 때문입니다. 대신, 일반적인 파싱 진입점을 사용하여 프로토콜로 더미 URL을 파싱합니다.

  3. parseResult가 실패면 TypeError를 throw합니다.

  4. parseResultscheme을 반환합니다.

사용자명 정규화를 문자열 value에 대해 실행하려면:
  1. value가 빈 문자열이면 value를 반환합니다.

  2. dummyURL더미 URL 생성으로 설정합니다.

  3. 사용자명 설정dummyURL, value로 실행합니다.

  4. dummyURLusername을 반환합니다.

비밀번호 정규화를 문자열 value에 대해 실행하려면:
  1. value가 빈 문자열이면 value를 반환합니다.

  2. dummyURL더미 URL 생성으로 설정합니다.

  3. 비밀번호 설정dummyURL, value로 실행합니다.

  4. dummyURLpassword를 반환합니다.

호스트명 정규화를 문자열 value에 대해 실행하려면:
  1. value가 빈 문자열이면 value를 반환합니다.

  2. dummyURL더미 URL 생성으로 설정합니다.

  3. parseResult기본 URL 파서value로 실행하되 dummyURLurl로, hostname statestate override로 설정합니다.

  4. parseResult가 실패면 TypeError를 throw합니다.

  5. dummyURLhostserialize한 값 또는 null이면 빈 문자열을 반환합니다.

IPv6 호스트명 정규화를 문자열 value에 대해 실행하려면:
  1. result를 빈 문자열로 설정합니다.

  2. code pointvalue리스트로 해석한 코드 포인트에서 반복합니다:

    1. 아래 모두 true이면:

      • code pointASCII 16진수가 아님;
      • code point가 U+005B ([)가 아님;
      • code point가 U+005D (])가 아님;
      • code point가 U+003A (:)가 아님,

      그 경우 TypeError를 throw합니다.

    2. ASCII 소문자화code point에 대해 실행한 결과를 result 끝에 추가합니다.

  3. result를 반환합니다.

포트 정규화를 문자열 portValue 및 선택적으로 문자열 protocolValue에 대해 실행하려면:
  1. portValue가 빈 문자열이면 portValue를 반환합니다.

  2. dummyURL더미 URL 생성으로 설정합니다.

  3. protocolValue가 주어졌으면 dummyURLschemeprotocolValue로 설정합니다.

    참고: URL recordscheme을 설정하는 것은 기본 URL 파서가 기본 포트값을 인식 및 정규화하기 위함입니다.

  4. parseResult기본 URL 파서portValue로 실행하되 dummyURLurl로, port statestate override로 설정합니다.

  5. parseResult가 실패면 TypeError를 throw합니다.

  6. dummyURLportserialize한 값 또는 null이면 빈 문자열을 반환합니다.

경로명(pathname) 정규화를 문자열 value에 대해 실행하려면:
  1. value가 빈 문자열이면 value를 반환합니다.

  2. leading slashvalue의 첫 코드 포인트가 U+002F(/)이면 true, 아니면 false로 설정합니다.

  3. modified valueleading slash가 false면 "/-", 아니면 빈 문자열로 설정합니다.

    URL 파서는 canonicalized pathname에 자동으로 선행 슬래시를 붙입니다. 하지만 이 알고리즘은 pathname의 부분에 대해 호출되므로, 슬래시 붙임을 막기 위해 직접 슬래시를 넣고, 점(.)이 앞에 올 때 "/." 패턴으로 오해하지 않게 추가 문자도 삽입합니다. 나중에 결과에서 이들 문자를 제거합니다.

    구현체는 성능 상 이 알고리즘에서 슬래시 삽입/제거 대신 파싱 코드에서 슬래시 붙임을 비활성화해도 됩니다.

  4. valuemodified value 끝에 추가합니다.

  5. dummyURL더미 URL 생성으로 설정합니다.

  6. Empty dummyURLpath를 비웁니다.

  7. 기본 URL 파서modified value로 실행하되 dummyURLurl로, path start statestate override로 설정합니다.

  8. resultURL 경로 serializedummyURL에 대해 실행한 결과로 설정합니다.

  9. leading slash가 false면 result를 2번째부터 끝까지 코드 포인트 서브스트링으로 설정합니다.

  10. result를 반환합니다.

불투명 경로명(opaque pathname) 정규화를 문자열 value에 대해 실행하려면:
  1. value가 빈 문자열이면 value를 반환합니다.

  2. dummyURL더미 URL 생성으로 설정합니다.

  3. dummyURLpath를 빈 문자열로 설정합니다.

  4. parseResultURL 파싱value로 실행하되 dummyURLurl로, opaque path statestate override로 설정합니다.

  5. parseResult가 실패면 TypeError를 throw합니다.

  6. URL 경로 serializedummyURL에 대해 실행한 결과를 반환합니다.

검색(search) 정규화를 문자열 value에 대해 실행하려면:
  1. value가 빈 문자열이면 value를 반환합니다.

  2. dummyURL더미 URL 생성으로 설정합니다.

  3. dummyURLquery를 빈 문자열로 설정합니다.

  4. 기본 URL 파서value로 실행하되 dummyURLurl로, query statestate override로 설정합니다.

  5. dummyURLquery를 반환합니다.

해시(hash) 정규화를 문자열 value에 대해 실행하려면:
  1. value가 빈 문자열이면 value를 반환합니다.

  2. dummyURL더미 URL 생성으로 설정합니다.

  3. dummyURLfragment를 빈 문자열로 설정합니다.

  4. 기본 URL 파서value로 실행하되 dummyURLurl로, fragment statestate override로 설정합니다.

  5. dummyURLfragment를 반환합니다.

3.2. URLPatternInit 처리

URLPatternInit 처리URLPatternInit init, 문자열 type, 문자열 또는 null protocol, 문자열 또는 null username, 문자열 또는 null password, 문자열 또는 null hostname, 문자열 또는 null port, 문자열 또는 null pathname, 문자열 또는 null search, 문자열 또는 null hash에 대해 실행하려면:
  1. result를 새 URLPatternInit으로 생성합니다.

  2. protocol이 null이 아니면 result["protocol"]protocol을 설정합니다.

  3. username이 null이 아니면 result["username"]username을 설정합니다.

  4. password이 null이 아니면 result["password"]password을 설정합니다.

  5. hostname이 null이 아니면 result["hostname"]hostname을 설정합니다.

  6. port가 null이 아니면 result["port"]port를 설정합니다.

  7. pathname이 null이 아니면 result["pathname"]pathname을 설정합니다.

  8. search가 null이 아니면 result["search"]search를 설정합니다.

  9. hash가 null이 아니면 result["hash"]hash를 설정합니다.

  10. baseURL을 null로 설정합니다.

  11. init["baseURL"]이 존재하면:

    base URL은 추가 컨텍스트를 제공할 수 있지만, 각 컴포넌트에서 init이 base URL보다 구체적인 컴포넌트를 포함하면 상속되지 않습니다.

    컴포넌트가 더 구체적이라는 것은 아래 두 리스트에서 더 뒤에 나타나면 더 구체적입니다(이는 URL 문법 순서와 거의 유사합니다):

    • protocol, hostname, port, pathname, search, hash

    • protocol, hostname, port, username, password

    username과 password는 URLPattern 생성 시 base URL에서 상속되지 않습니다. (단, test() 또는 exec() 호출 시 인자로 전달된 URL 파싱에는 상속됩니다.)

    1. baseURL기본 URL 파서init["baseURL"]에 실행한 결과로 설정합니다.

    2. baseURL이 실패면 TypeError를 throw합니다.

    3. init["protocol"]이 존재하지 않으면 base URL 문자열 처리baseURLscheme, type으로 실행한 결과를 result["protocol"]에 설정합니다.

    4. type이 "pattern"이 아니고 init이 "protocol", "hostname", "port", "username" 중 아무 것도 포함하지 않으면 base URL 문자열 처리baseURLusername, type으로 result["username"]에 설정합니다.

    5. type이 "pattern"이 아니고 init이 "protocol", "hostname", "port", "username", "password" 중 아무 것도 포함하지 않으면 base URL 문자열 처리baseURLpassword, type으로 result["password"]에 설정합니다.

    6. init이 "protocol"과 "hostname" 모두 포함하지 않으면:

      1. baseHost를 빈 문자열로 설정합니다.

      2. baseURLhost가 null이 아니면 serialize한 값을 baseHost로 설정합니다.

      3. base URL 문자열 처리baseHost, type으로 실행한 결과를 result["hostname"]에 설정합니다.

    7. init이 "protocol", "hostname", "port" 모두 포함하지 않으면:

      1. baseURLport가 null이면 result["port"]에 빈 문자열을 설정합니다.

      2. 그 외에는 result["port"]에 baseURLportserialize한 값을 설정합니다.

    8. init이 "protocol", "hostname", "port", "pathname" 모두 포함하지 않으면 base URL 문자열 처리URL 경로 serialize baseURL, type으로 실행한 결과를 result["pathname"]에 설정합니다.

    9. init이 "protocol", "hostname", "port", "pathname", "search" 모두 포함하지 않으면:

      1. baseQuerybaseURLquery로 설정합니다.

      2. baseQuery가 null이면 빈 문자열로 설정합니다.

      3. base URL 문자열 처리baseQuery, type으로 실행한 결과를 result["search"]에 설정합니다.

    10. init이 "protocol", "hostname", "port", "pathname", "search", "hash" 모두 포함하지 않으면:

      1. baseFragmentbaseURLfragment로 설정합니다.

      2. baseFragment가 null이면 빈 문자열로 설정합니다.

      3. base URL 문자열 처리baseFragment, type으로 실행한 결과를 result["hash"]에 설정합니다.

  12. init["protocol"]이 존재하면 process protocol for initinit["protocol"], type으로 실행한 결과를 result["protocol"]에 설정합니다.

  13. init["username"]이 존재하면 process username for initinit["username"], type으로 실행한 결과를 result["username"]에 설정합니다.

  14. init["password"]이 존재하면 process password for initinit["password"], type으로 실행한 결과를 result["password"]에 설정합니다.

  15. init["hostname"]이 존재하면 process hostname for initinit["hostname"], type으로 실행한 결과를 result["hostname"]에 설정합니다.

  16. resultProtocolString을 result["protocol"]이 존재하면 해당 값, 아니면 빈 문자열로 설정합니다.

  17. init["port"]이 존재하면 process port for initinit["port"], resultProtocolString, type으로 실행한 결과를 result["port"]에 설정합니다.

  18. init["pathname"]이 존재하면:

    1. result["pathname"]에 init["pathname"]를 설정합니다.

    2. 아래 모두 true라면:

      그 경우:

      1. baseURLPathbase URL 문자열 처리URL 경로 serialize baseURL, type으로 실행한 결과로 설정합니다.

      2. slash indexbaseURLPath에서 마지막 U+002F(/) 코드 포인트의 인덱스로(코드 포인트 시퀀스 기준), 없으면 null로 설정합니다.

      3. slash index가 null이 아니면:

        1. new pathname코드 포인트 서브스트링 0~(slash index+1) 까지 baseURLPath에서 추출합니다.

        2. result["pathname"]를 new pathname 뒤에 추가합니다.

        3. result["pathname"]에 new pathname을 설정합니다.

    3. result["pathname"]에 process pathname for init을 result["pathname"], resultProtocolString, type으로 실행한 결과를 설정합니다.

  19. init["search"]이 존재하면 process search for initinit["search"], type으로 실행한 결과를 result["search"]에 설정합니다.

  20. init["hash"]가 존재하면 process hash for initinit["hash"], type으로 실행한 결과를 result["hash"]에 설정합니다.

  21. result를 반환합니다.

base URL 문자열 처리를 문자열 input, 문자열 type에 대해 실행하려면:
  1. 단언: input이 null이 아님을 보장합니다.

  2. type이 "pattern"이 아니면 input을 반환합니다.

  3. 패턴 문자열 이스케이프input에 대해 실행한 결과를 반환합니다.

절대 경로명 여부패턴 문자열 input, 문자열 type에 대해 실행하려면:
  1. input이 빈 문자열이면 false 반환.

  2. input[0]이 U+002F(/)이면 true 반환.

  3. type이 "url"이면 false 반환.

  4. input코드 포인트 길이가 2 미만이면 false 반환.

  5. input[0]이 U+005C(\)이고 input[1]이 U+002F(/)이면 true 반환.

  6. input[0]이 U+007B({)이고 input[1]이 U+002F(/)이면 true 반환.

  7. false 반환.

process protocol for init를 문자열 value, 문자열 type에 대해 실행하려면:
  1. strippedValuevalue에서 마지막 U+003A(:) 하나를 제거한 값으로 설정합니다.

  2. type이 "pattern"이면 strippedValue를 반환합니다.

  3. 프로토콜 정규화strippedValue에 대해 실행한 결과를 반환합니다.

process username for init를 문자열 value, 문자열 type에 대해 실행하려면:
  1. type이 "pattern"이면 value를 반환합니다.

  2. 사용자명 정규화value에 대해 실행한 결과를 반환합니다.

process password for init를 문자열 value, 문자열 type에 대해 실행하려면:
  1. type이 "pattern"이면 value를 반환합니다.

  2. 비밀번호 정규화value에 대해 실행한 결과를 반환합니다.

process hostname for init를 문자열 value, 문자열 type에 대해 실행하려면:
  1. type이 "pattern"이면 value를 반환합니다.

  2. 호스트명 정규화value에 대해 실행한 결과를 반환합니다.

process port for init를 문자열 portValue, 문자열 protocolValue, 문자열 type에 대해 실행하려면:
  1. type이 "pattern"이면 portValue를 반환합니다.

  2. 포트 정규화portValue, protocolValue에 대해 실행한 결과를 반환합니다.

process pathname for init를 문자열 pathnameValue, 문자열 protocolValue, 문자열 type에 대해 실행하려면:
  1. type이 "pattern"이면 pathnameValue를 반환합니다.

  2. protocolValue특수 scheme이거나 빈 문자열이면, 경로명 정규화pathnameValue에 대해 실행한 결과를 반환합니다.

    protocolValue가 빈 문자열이면 생성자 딕셔너리에서 protocol이 제공되지 않은 것과 같습니다. 일반적으로 빈 문자열 값에 특수 처리를 하지 않지만, 이 경우에는 특수 scheme으로 간주하여 가장 일반적인 경로명 정규화로 처리합니다.

  3. 불투명 경로명 정규화pathnameValue에 대해 실행한 결과를 반환합니다.

process search for init를 문자열 value, 문자열 type에 대해 실행하려면:
  1. strippedValuevalue에서 첫 U+003F(?)를 하나 제거한 값으로 설정합니다.

  2. type이 "pattern"이면 strippedValue를 반환합니다.

  3. 검색 정규화strippedValue에 대해 실행한 결과를 반환합니다.

process hash for init를 문자열 value, 문자열 type에 대해 실행하려면:
  1. strippedValuevalue에서 첫 U+0023(#)를 하나 제거한 값으로 설정합니다.

  2. type이 "pattern"이면 strippedValue를 반환합니다.

  3. 해시 정규화strippedValue에 대해 실행한 결과를 반환합니다.

4. 다른 명세에서 URL 패턴 사용하기

웹 플랫폼의 일관성을 높이기 위해, 이 명세와 통합되는 다른 문서들은 특별한 사유가 없는 한 아래 지침을 따라야 합니다.

  1. 축약형 허용. 대부분의 저작자 패턴은 단순합니다. 따라서 API는 흔한 케이스에 대해 축약형을 받아들이고 저작자가 완전한 URLPattern 객체로 변환하는 추가 작업을 하지 않도록 해야 합니다.

  2. 기준(base) URL 준수. 일반적으로 URL은 환경의 기준 URL(대부분 문서 base URL)을 기준으로 파싱됩니다. URL 패턴도 이를 따라야 합니다. 단, URLPattern 생성자는 개념 자체를 직접 노출하므로 예외입니다. 이는 URL 생성자가 플랫폼 전체와 달리 기준 URL을 따르지 않는 것과 유사합니다.

  3. 정규표현식 그룹 명확히. 일부 API는 정규표현식 그룹이 없는 URL 패턴만 허용하는 것이 유익할 수 있습니다. 예를 들어, 사용자 에이전트가 저작자 스크립트와 다른 쓰레드/프로세스에서 이를 구현할 수 있고, 보안/성능상의 이유로 JavaScript 엔진이 별도로 실행되지 않을 수 있기 때문입니다. 이 경우 명확히 문서화(참조: 정규표현식 그룹 보유 여부)하고, 가능한 빨리 오류(예: 예외 throw)를 보고해야 합니다. 이 제약이 미래에 해제될 수 있으므로, 기능 탐지(feature detection)가 가능해야 합니다. 편의상 URL 패턴의 부분집합을 만들기 전에 이 명세의 편집자와 상의하세요.

  4. 어떤 URL이 매칭되는지 명확히. 예를 들어, fetch 알고리즘은 fragment가 없는 URL에 대해 동작하는 경우가 많습니다. 그렇다면 명세에 이를 명확히 나타내고, 매칭이 불가능한 패턴(예: non-empty fragment 요구) 사용 시 개발자 경고를 주는 것도 권장할 수 있습니다.

4.1. JavaScript API와의 통합

typedef (USVString or URLPatternInit or URLPattern) URLPatternCompatible;

JavaScript API는 다음 모두를 받아야 합니다:

이를 위해 명세는 URLPatternCompatible 타입을 operation 또는 dictionary member의 인자로 받아, 아래 알고리즘을 사용해 처리해야 합니다. 적절한 environment settings objectAPI base URL을 사용하세요.

URLPattern 객체를 Web IDL 값에서 생성URLPatternCompatible input, URL baseURL, realm realm에 대해 다음을 수행:
  1. input특정 타입URLPattern이면:

    1. input을 반환합니다.

  2. 그 외:

    1. pattern새로운 URLPattern (realm 지정)으로 생성합니다.

    2. pattern연결된 URL 패턴Web IDL 값에서 URL 패턴 생성input, baseURL로 실행한 결과로 설정합니다.

    3. pattern을 반환합니다.

Web IDL 값에서 URL 패턴 생성URLPatternCompatible input, URL baseURL에 대해 다음을 수행:
  1. input특정 타입URLPattern이면:

    1. input연결된 URL 패턴을 반환합니다.

  2. 그 외, input특정 타입URLPatternInit이면:

    1. initcloneinput으로 설정합니다.

    2. init["baseURL"]이 존재하지 않으면, baseURLserialize한 값을 설정합니다.

    3. URL 패턴 생성init, null, 빈 map으로 실행한 결과를 반환합니다.

  3. 그 외:

    1. 단언: input특정 타입USVString임을 보장합니다.

    2. URL 패턴 생성input, baseURLserialize한 값, 빈 map으로 실행한 결과를 반환합니다.

이로써 저작자는 대부분의 패턴을 간결하게 명시할 수 있고, 생성자를 통해 드물게 필요한 옵션에 접근할 수 있습니다. base URL의 암묵적 사용은 HTMLURL 파싱 알고리즘과 유사하며 일관성을 유지합니다. [HTML]

4.2. JSON 데이터 형식과의 통합

URL 패턴을 포함하는 JSON 데이터 형식은 JavaScript API 동작과 동일하게 다음을 모두 허용해야 합니다:

명세에 Infra 값이 있다면(예: JSON 문자열을 Infra 값으로 파싱을 이용한 후), 아래 알고리즘을 사용하여 적절한 기준 baseURL(기본적으로 JSON 리소스의 URL)을 사용하세요. [INFRA]

Infra 값에서 URL 패턴 생성rawPattern, URL baseURL에 대해 다음을 수행:
  1. serializedBaseURLbaseURLserialize한 값으로 설정합니다.

  2. rawPattern문자열이면:

    1. URL 패턴 생성rawPattern, serializedBaseURL, 빈 map으로 실행한 결과를 반환합니다.

      향후 옵션이 필요하다면 여기서 비어있지 않은 옵션을 추가할 수 있습니다.
  3. 그 외, rawPatternmap이면:

    1. init을 «[ "baseURL" → serializedBaseURL ]»로 설정(즉, URLPatternInit 타입의 딕셔너리).

    2. keyvaluerawPattern에서 반복:

      1. keyURLPatternInit식별자가 아니거나, value문자열이 아니거나, 해당 멤버 타입이 USVString이 아니라면 null 반환.

        향후 URLPatternInit가 다른 타입 멤버를 가지면 업데이트 필요.
        향후 덜 엄격한 모드를 지원할 수도 있습니다.
      2. init[key]에 value를 설정합니다.

    3. URL 패턴 생성init, null, 빈 map으로 실행한 결과를 반환합니다.

      향후 옵션이 필요하다면 여기서 비어있지 않은 옵션을 추가할 수 있습니다.
  4. 그 외에는 null 반환.

명세는 URLPatternOptions에 대한 옵션, baseURL 재정의 등도 허용할 수 있습니다. JSON에서는 URLPattern 객체를 직접 만들 수 없으므로, 예를 들어 Speculation Rules는 "relative_to" 키로 문서 base URL을 JSON 리소스의 URL 대신 사용할 수 있습니다. [SPECULATION-RULES]

4.3. HTTP 헤더 필드와의 통합

URL 패턴을 포함하는 HTTP 헤더는 생성자 문자열 문법의 문자열을 받아야 하며, 이는 structured field의 일부로 처리될 수 있습니다. [RFC9651].

현재 알려진 헤더는 URL 패턴에 대해 딕셔너리 문법을 허용하지 않습니다. 만약 바뀐다면 이 명세도 [RFC9651] 내부 리스트 처리로 규정할 것입니다.

HTTP 헤더 명세는 URL 패턴 자체(예: 매칭 알고리즘 사용)를 대상으로 해야 하며, URLPattern 객체(즉, JavaScript realm 필요)에는 의존하지 않아야 합니다.

HTTP 구조화 필드 값에서 URL 패턴 생성rawPattern, URL baseURL에서 실행하려면:
  1. serializedBaseURLbaseURLserialize한 값으로 설정합니다.

  2. 단언: rawPattern문자열임을 보장합니다.

  3. URL 패턴 생성rawPattern, serializedBaseURL, 빈 map으로 실행한 결과를 반환합니다.

명세는 패턴 평가 시 정규표현식 그룹 없음 패턴만 허용하는 것도 고려할 수 있습니다. 이런 패턴의 성능이 더 안정적이며, [ECMA-262] 정규표현식 구현을 필요로 하지 않아 보안/코드 사이즈/구현 부담 면에서 유리할 수 있기 때문입니다. 반면 JavaScript API는 해당 구현이 항상 가능한 환경에서 실행됩니다.

감사의 말씀

편집자들은 아래 분들께 감사의 뜻을 전합니다. Alex Russell, Anne van Kesteren, Asa Kusuma, Blake Embrey, Cyrus Kasaaian, Daniel Murphy, Darwin Huang, Devlin Cronin, Domenic Denicola, Dominick Ng, Jake Archibald, Jeffrey Posnick, Jeremy Roman, Jimmy Shen, Joe Gregorio, Joshua Bell, Kenichi Ishibashi, Kenji Baheux, Kenneth Rohde Christiansen, Kingsley Ngan, Kinuko Yasuda, L. David Baron, Luca Casonato, Łukasz Anforowicz, Makoto Shimazu, Marijn Kruisselbrink, Matt Falkenhagen, Matt Giuca, Michael Landry, R. Samuel Klatchko, Rajesh Jagannathan, Ralph Chelala, Sangwhan Moon, Sayan Pal, Victor Costan, Yoshisato Yanagisawa, Youenn Fablet 이 명세에 기여해주신 모든 분들께 감사드립니다.

특별히 Blake Embrey와 pillarjs/path-to-regexp 기여자들께 감사의 말씀을 드립니다. 많은 사람들이 유용하게 사용한 훌륭한 오픈소스 라이브러리를 만들어주셨습니다.

또한 Kenneth Rohde Christiansen의 polyfill 작업에도 특별히 감사드립니다. 그는 변화하는 URLPattern API에 맞춰 광범위하게 수정 작업을 해주셨습니다.

이 표준은 다음 저자에 의해 작성되었습니다. Ben Kelly (Google, wanderview@chromium.org), Jeremy Roman (Google, jbroman@chromium.org), 그리고 宍戸俊哉 (Shunya Shishido, Google, sisidovski@chromium.org).

지적 재산권(Intellectual property rights)

이 현행 표준은 W3C WICG에서 처음 개발되었으며, W3C 소프트웨어 및 문서 라이선스 하에 제공되었습니다.

Copyright © WHATWG (Apple, Google, Mozilla, Microsoft). 이 작업은 크리에이티브 커먼즈 저작자표시 4.0 국제 라이선스 하에 라이선스됩니다. 이 표준의 일부가 소스 코드에 통합되는 경우, 해당 부분은 BSD 3-Clause 라이선스에 따라 소스 코드에서 라이선스됩니다.

이 문서는 현행 표준입니다. 특허 심사 버전에 관심이 있으신 분은 현행 표준 심사 초안을 참고하시기 바랍니다.

색인(Index)

이 명세에서 정의된 용어

참조로 정의된 용어

참고문헌(References)

규범적 참고문헌(Normative References)

[ECMA-262]
ECMAScript 언어 명세. URL: https://tc39.es/ecma262/multipage/
[HTML]
Anne van Kesteren; et al. HTML 표준. 현행 표준. URL: https://html.spec.whatwg.org/multipage/
[INFRA]
Anne van Kesteren; Domenic Denicola. Infra 표준. 현행 표준. URL: https://infra.spec.whatwg.org/
[RFC9651]
M. Nottingham; P-H. Kamp. HTTP를 위한 구조화 필드 값. 2024년 9월. 제안 표준. URL: https://www.rfc-editor.org/rfc/rfc9651
[URL]
Anne van Kesteren. URL 표준. 현행 표준. URL: https://url.spec.whatwg.org/
[WEBIDL]
Edgar Chen; Timothy Gu. Web IDL 표준. 현행 표준. URL: https://webidl.spec.whatwg.org/

참고용 참고문헌(Informative References)

[SPECULATION-RULES]
Speculation Rules. 커뮤니티 그룹 초안 보고서(Draft Community Group Report). URL: https://wicg.github.io/nav-speculation/speculation-rules.html

IDL 색인

typedef (USVString or URLPatternInit) URLPatternInput;

[Exposed=(Window,Worker)]
interface URLPattern {
  constructor(URLPatternInput input, USVString baseURL, optional URLPatternOptions options = {});
  constructor(optional URLPatternInput input = {}, optional URLPatternOptions options = {});

  boolean test(optional URLPatternInput input = {}, optional USVString baseURL);

  URLPatternResult? exec(optional URLPatternInput input = {}, optional USVString baseURL);

  readonly attribute USVString protocol;
  readonly attribute USVString username;
  readonly attribute USVString password;
  readonly attribute USVString hostname;
  readonly attribute USVString port;
  readonly attribute USVString pathname;
  readonly attribute USVString search;
  readonly attribute USVString hash;

  readonly attribute boolean hasRegExpGroups;
};

dictionary URLPatternInit {
  USVString protocol;
  USVString username;
  USVString password;
  USVString hostname;
  USVString port;
  USVString pathname;
  USVString search;
  USVString hash;
  USVString baseURL;
};

dictionary URLPatternOptions {
  boolean ignoreCase = false;
};

dictionary URLPatternResult {
  sequence<URLPatternInput> inputs;

  URLPatternComponentResult protocol;
  URLPatternComponentResult username;
  URLPatternComponentResult password;
  URLPatternComponentResult hostname;
  URLPatternComponentResult port;
  URLPatternComponentResult pathname;
  URLPatternComponentResult search;
  URLPatternComponentResult hash;
};

dictionary URLPatternComponentResult {
  USVString input;
  record<USVString, (USVString or undefined)> groups;
};

typedef (USVString or URLPatternInit or URLPattern) URLPatternCompatible;

MDN

URLPattern/URLPattern

In only one current engine.

FirefoxNoneSafariNoneChrome95+
Opera?Edge95+
Edge (Legacy)?IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?
MDN

URLPattern/exec

In only one current engine.

FirefoxNoneSafariNoneChrome95+
Opera?Edge95+
Edge (Legacy)?IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?
MDN

URLPattern/hash

In only one current engine.

FirefoxNoneSafariNoneChrome95+
Opera?Edge95+
Edge (Legacy)?IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?
MDN

URLPattern/hostname

In only one current engine.

FirefoxNoneSafariNoneChrome95+
Opera?Edge95+
Edge (Legacy)?IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?
MDN

URLPattern/password

In only one current engine.

FirefoxNoneSafariNoneChrome95+
Opera?Edge95+
Edge (Legacy)?IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?
MDN

URLPattern/pathname

In only one current engine.

FirefoxNoneSafariNoneChrome95+
Opera?Edge95+
Edge (Legacy)?IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?
MDN

URLPattern/port

In only one current engine.

FirefoxNoneSafariNoneChrome95+
Opera?Edge95+
Edge (Legacy)?IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?
MDN

URLPattern/protocol

In only one current engine.

FirefoxNoneSafariNoneChrome95+
Opera?Edge95+
Edge (Legacy)?IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?
MDN

URLPattern/search

In only one current engine.

FirefoxNoneSafariNoneChrome95+
Opera?Edge95+
Edge (Legacy)?IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?
MDN

URLPattern/test

In only one current engine.

FirefoxNoneSafariNoneChrome95+
Opera?Edge95+
Edge (Legacy)?IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?
MDN

URLPattern/username

In only one current engine.

FirefoxNoneSafariNoneChrome95+
Opera?Edge95+
Edge (Legacy)?IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?
MDN

URLPattern

In only one current engine.

FirefoxNoneSafariNoneChrome95+
Opera?Edge95+
Edge (Legacy)?IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?