정규표현식 질문이요..
조회수 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를 만족할 수 있습니다. 이 외에도 만족해야 할 조건은- /api뒤로 다른 문자열이 있어도 True일 것
- 단, 문자열이 /로 끝나지 않을 것
인데요.
우선 제가 쓴 정규표현식
.*[^\/]$
을 끊어서 설명하면 다음과 같고,.*
: 길이에 관계없이, 모든 문자열에 대해서 True[^\/]
: /아닌 문자열에 대해 True$
: 스트링의 끝
이걸 조합하면 "길이에 관계 없이 어떤 문자열이 와도 괜찮지만(
.*
), \로는 끝나지 않는다([^\/]$
)" 가 됩니다.-
(•́ ✖ •̀)
알 수 없는 사용자
- 정말 감사합니다. !!!! 문제는 해결되었지만 negrate lookbehind 대신 써주신 부분이 이해가 잘 안가네요ㅠㅠ 알 수 없는 사용자 2017.1.19 16:33
- 정말 대단하시네요! 감사합니다. 알 수 없는 사용자 2017.1.19 16:33
- 답을 수정하고 설명도 추가했으니 확인해보세요 알 수 없는 사용자 2017.1.19 16:48
-
/api
를 포함해야 True라고 생각했습니다.\/api(?!\/users).*(?<!\/)$
이렇게 짤 수 있네요
\/api(?!\/users)
: /api를 포함하고, /users가 뒤따르지 않는 문자열이면 True.*
: 뒤에 어떤 문자열이 오던간에 True(line terminator 제외)(?<!\/)$
: 단, /로 끝나지 않을 것
- negate lookbehind를 지원하지 않는 자바스크립트로는 이 방법을 쓸 수 없습니다.
-
(•́ ✖ •̀)
알 수 없는 사용자
-
/\/api(?!\/users).*(?<!\/)$/
그대로 콘솔창에 치니 에러가 뜹니다.. 3번에서 <는 무슨 의미인가요?다시보니 질문 조건이 이상했네요
`/api` // true `/api?id=1234` // true `/api/` // false `/api/users` // false
-
(•́ ✖ •̀)
알 수 없는 사용자
- 어떤 언어를 사용하시나요? 해당 언어에서 negate lookbehind를 지원하지 않을 수 있습니다. 알 수 없는 사용자 2017.1.19 15:19
- 자바스크립트입니다. 알 수 없는 사용자 2017.1.19 15:24
- 아 자바스크립트는 지원안한다고 쓰셨네요;;; 이제 봤습니다. 알 수 없는 사용자 2017.1.19 15:24
-
댓글 입력