찾다

 >  Q&A  >  본문

java - 如何编写一个web 框架的 url 路由

如果路由都只是 url 字符串完全匹配的,我可以用 hashmap ,理想情况 O(1) 复杂度。
但是我想在 url 匹配中支持 通配符,那么最简单的实现方法,我就直接用正则了,但是匹配复杂度就变成 O(n)了,这样感觉不是很好。。。

如何解决这个问题

PHP中文网PHP中文网2809일 전494

모든 응답(4)나는 대답할 것이다

  • 巴扎黑

    巴扎黑2017-04-18 09:50:46

    라우팅 주소를 저장하기 위해 트리를 사용하는 것은 어떨까요?
    그림과 같이 각 상자는 Map입니다
    /user/111/profile/books/222를 요청할 때 먼저 URL을 분할하세요. 🎜>['/' , '111' , 'profile' , 'books' , '222']
    먼저 첫 번째 레이어에 / 노드가 있는지 검색
    다음에 111 노드가 있는지 검색 두 번째 레이어, 그렇지 않은 경우 * 노드
    를 입력한 다음 검색한 세 번째 레이어에 프로필 노드
    가 있는지 확인하는 등

    회신하다
    0
  • PHP中文网

    PHP中文网2017-04-18 09:50:46

    https://github/bephp/router

    이 프로젝트는 정규식을 사용하지 않고 "/"에 따라 URL을 잘라서 트리 구조로 저장합니다.

    경로를 매핑하는 것은 트리를 순회하는 것과 동일하며 복잡도는 O(log n)입니다.

    이 프로젝트는 PHP로 구현되었지만 코드가 매우 작습니다. 이해하기 쉬워야 합니다.

    회신하다
    0
  • 伊谢尔伦

    伊谢尔伦2017-04-18 09:50:46

    라우팅 Dict를 유지 관리할 수 없는 이유는 무엇인가요? 값은 키에 해당하는 func

    입니다.

    회신하다
    0
  • 黄舟

    黄舟2017-04-18 09:50:46

    라우팅 시 정규 표현식이 보여주는 유연성은 다른 기술로 대체하기 어렵습니다. 일반 규칙을 사용하여 성능을 최적화할 수도 있습니다. 원리는 매우 간단합니다. 일반 규칙을 결합하고 특정 전략을 사용하여 일반 일치 결과를 기반으로 하는

    을 결정합니다.

    예를 들어

    • /사용자/{pid}/프로필

    • /뉴스

    • /product/{pid}

    • /product/{pid}/comment/{cid}

    4개 노선

    정규 표현식#^(?|/user/(d+)/profile|/news|/product/(d+)()|/product/(d+)/comment/(d+)())$#을 사용하여

    과 일치시키세요.

    캡처 결과에 각각 1, 0, 2, 3개의 그룹이 포함되어 있으면 각각 1~4번 경로가 일치되었음을 알 수 있습니다. 정규식을 일부 코드와 자동으로 병합하고 캡처 그룹 수 => 라우팅 매핑을 할당하면 여러 정규식을 하나의 일치 항목으로 병합할 수 있습니다

    다음은 (?|)을 사용하여 캡처 그룹을 재설정하는 요령입니다

    참고 http://nikic.github.io/2014/0...

    회신하다
    0
  • 취소회신하다