정규표현식 질문이요..

조회수 1435회

uri 문자열을 체크하고 있는데, 정규표현식 글을 많이 봐도 정말 이해가 어렵네요;;;

그래서 질문드립니다. 도와주세요!


조건은 아래와 같습니다.

마지막 문자에 '/'가 나오면 false

/api/users > false

/api > true

/api?id=asfdasjlk&asdf=asdf > true

제가 해본 바로는 /api/users 까지는 false가 되는데, /api도 false가 반환되네요, true가 되어야 하는데,

정규표현식 내부에서 If문을 써야할것같은데 답답하네요 ㅠ

/\/api\/users[a-zA-Z0-9^\/]/.test('/api/users')
  • (•́ ✖ •̀)
    알 수 없는 사용자

3 답변

  • 그럼 이쪽은 어떤가요

    \/api(?!\/users).*[^\/]$
    

    negate lookbehind 대신 (.*[^\/]+)?$를 넣었습니다. 이건 자바스크립트에서도 쓸 수 있습니다.


    정규 표현식 자체도 더 줄일수 있어서 수정했으며, (.*[^\/])?$이 부분이 이해가 안간다고 하셔서 설명을 추가하겠습니다.

    앞선 \/api(?!\/users)/api = True, /api/users = False를 만족할 수 있습니다. 이 외에도 만족해야 할 조건은

    1. /api뒤로 다른 문자열이 있어도 True일 것
    2. 단, 문자열이 /로 끝나지 않을 것

    인데요.

    우선 제가 쓴 정규표현식.*[^\/]$을 끊어서 설명하면 다음과 같고,

    • .*: 길이에 관계없이, 모든 문자열에 대해서 True
    • [^\/]: /아닌 문자열에 대해 True
    • $: 스트링의 끝

    이걸 조합하면 "길이에 관계 없이 어떤 문자열이 와도 괜찮지만(.*), \로는 끝나지 않는다([^\/]$)" 가 됩니다.

    • (•́ ✖ •̀)
      알 수 없는 사용자
    • 정말 감사합니다. !!!! 문제는 해결되었지만 negrate lookbehind 대신 써주신 부분이 이해가 잘 안가네요ㅠㅠ 알 수 없는 사용자 2017.1.19 16:33
    • 정말 대단하시네요! 감사합니다. 알 수 없는 사용자 2017.1.19 16:33
    • 답을 수정하고 설명도 추가했으니 확인해보세요 알 수 없는 사용자 2017.1.19 16:48
  • /api를 포함해야 True라고 생각했습니다.

    \/api(?!\/users).*(?<!\/)$
    

    이렇게 짤 수 있네요

    1. \/api(?!\/users) : /api를 포함하고, /users가 뒤따르지 않는 문자열이면 True
    2. .*: 뒤에 어떤 문자열이 오던간에 True(line terminator 제외)
    3. (?<!\/)$: 단, /로 끝나지 않을 것
    • negate lookbehind를 지원하지 않는 자바스크립트로는 이 방법을 쓸 수 없습니다.
    • (•́ ✖ •̀)
      알 수 없는 사용자
  • /\/api(?!\/users).*(?<!\/)$/ 그대로 콘솔창에 치니 에러가 뜹니다.. 3번에서 <는 무슨 의미인가요?

    다시보니 질문 조건이 이상했네요

    `/api` 
    // true
    
    `/api?id=1234`
    // true
    
    `/api/`
    // false
    
    `/api/users` 
    //  false
    
    • (•́ ✖ •̀)
      알 수 없는 사용자

답변을 하려면 로그인이 필요합니다.

프로그래머스 커뮤니티는 개발자들을 위한 Q&A 서비스입니다. 로그인해야 답변을 작성하실 수 있습니다.

(ಠ_ಠ)
(ಠ‿ಠ)