2016-11-18 4 views
-2

나는 다음과 같은 정규 표현식이 있습니다이 정규식이 URL과 일치하지 않는 이유는 무엇입니까?

^(?=\w+)(-\w+)(?!\.) 

나는 다음과 같은 텍스트에 맞게하려고 해요 :

그것이
www-test1.examples.com 

정규식과 문자열 만 -test1 부분과 일치해야합니다 경우에만 첫 번째는 . 앞에 있고 표현의 시작 이후입니다. www은 임의의 문자열이 될 수 있지만 일치하지 않아야합니다.

내 패턴이 -test1 부분과 일치하지 않습니다. 내가 뭘 놓치고 있니?

+0

실제 공백에 공백이 있습니까? 미리보기가 어떻게 작동하는지 알고 있습니까? 어떤 언어/도구를 사용하고 있습니까? –

+0

죄송합니다. 지금 삭제하십시오. 왜 downvote? – genonymous

+0

'www'가 임의의 문자열이 될 수 있다면, 일치해야 할 텍스트의 요구 사항이 무엇인지는 모르겠지만 일치해야합니다. – funkwurm

답변

2

자바는 기본적으로 사용할 수있는 것을 의미한다 (비 고정 길이 모양 비하인드을 지원하는 유일한 언어 중 하나입니다 수량계)를 사용하므로 기술적으로 다음을 사용할 수 있습니다.

(?<=^\w+)(-\w+)

위 항목을 캡처하지 않고 -test과 일치합니다. 그러나 일반적으로 고정 길이가 아닌 룩백은 완벽하지 않으며 효율성도 뛰어나지 않으며 다른 언어에서도 사용할 수 없으므로 일반적으로 권장되지 않습니다. 말하자면 .. 이것은 단순한 패턴이므로, 당신이 이식성에 대해 신경 쓰지 않는다면, 그것으로 가십시오.

^\w+(-\w+)

추신 :

은 더 나은 솔루션은하지만 캡처하고 캡처 한 그룹을 참조 할 것 그룹에 (이 경우, 그룹 1)입니다 - \w은 점과 일치하지 않으므로이를 미리 볼 필요가 없습니다.

p.p.s. - 원래 패턴 ^(?=\w+)(-\w+)(?!\.)이 일치하지 않는 이유에 대한 질문에 대답하십시오. 이유는 다음과 같습니다.

1) 문자열 어설 션의 시작 부분부터 시작하여 다음 단어가 하나 이상의 단어 문자인지 확인하기 위해 미리보기를 사용하십시오. 그러나 lookaheads는 제로 너비 어설 션으로, 일치하는 문자가 실제로 사용되지 않으므로 포인터가 일치 한 후에 다음 문자로 넘어 가지 않습니다. 따라서 "www"가 패턴과 일치하고 패턴의 다음 부분으로 이동하지만 실제 포인터는 문자열의 시작 부분을지나 가지 않았습니다. 그러면 다음에 (-\w+) 부분과 일치하게됩니다. 음, 문자열이 "-"로 시작하지 않아 패턴이 실패합니다.

2) (?!\.)은 부정적 예측입니다.여러분의 예제 문자열은 "테스트"부분 다음에 점을 표시합니다. 그래서 # 1이 실패하지 않더라도 실패 할 것입니다.

+0

감사합니다. 첫 번째 정규식은 내가 찾던 답변입니다. 당신이 언급 한 상세한 경고에 감사드립니다. '-test2' 자체가'.' 뒤에 오는 것을 기대하는 regex의 더 엄격한 버전은 어떻습니까? '(? <=^\ w +) (- \ w +) (? = \.)' – genonymous

+1

@genonymous 그것은 여러분에게 달려 있습니다. 내가 게시 한 내용은 예를 들어 'www-test1-foo.examples.com'은 유효한 (하위) 도메인입니다. 그러나'- \ w' 다음에 아무 것도 기대하지 않으려면'(? = \.)'를 추가하십시오. –

1

문제는 선견입니다. 이 경우 -과 첫 번째 . 사이의 정보를 캡처하려면 부적절합니다. 당신이 원하는 패턴이 같은 것입니다 :이 경우

(-\w+)(?=\.) 

캡처 그룹 1의 내용이 원하는 텍스트를 포함합니다.

Demo on Regex101

+0

답장을 보내 주셔서 감사합니다. 그러나 www와 dot (.)이 일치하지 않기를 바랍니다. 그래서 선견자를 사용했습니다. 이제 나는 그것에 대해 더 많이 생각해 보았습니다. 원래의 질문에있는 정규 표현식은 긍정적 인 시각과 긍정적 인 시각을 바탕으로'^ (? = \ w +) (- \ w +) (? <= \. 그러나 이것도 작동하지 않습니다. – genonymous

+0

@genonymous Lookbehind가 왼쪽에 있어야하며, 앞부분이 오른쪽에 있어야합니다. – Barmar

+0

@genonymous :'www'와의 일치에는 특별한 문제가 있습니까? 일반적으로 말해서, 당신은 원하는 것처럼 임의 길이의 lookbehind를 가질 수 없기 때문입니다. –

관련 문제