2012-06-17 4 views
0

일치하려는 문자는 문자 (글자 + 숫자 + 하이픈 (-))와 5 자리 다음 9 자리입니다. 패턴의 각 부분은 하이픈으로 구분됩니다. (-) 5 자리 및 9 자리 부분은 선택 사항입니다. 그 중 하나는 존재할 수 있고 다른 하나는 존재하지 않을 수도 있고 존재하지 않을 수도 있거나 존재하지 않을 수도 있습니다. 위는 다음과 같이 진행에 대한 그래서 패턴이이 정규식에 무슨 문제가 있습니까

bla-12-bla-98-bla-12345-123456789  all parts(characters+5-digit+9-digit) 
bla-bla-123-12345      9-digit part absent 
blasd-123456789      5-digit part absent 
no-1045-numeric-bla-bla    both numeric parts absent 

처럼 될 수 있습니다 내가 생각 해낸 정규식이

.+(\d{5})?-?(\d{9})?$ 

추론이다. 처음에는 .+이 모든 문자와 일치하기 때문에 (\d{5})?은 5 자리 부분이 0 또는 1 인 경우 선택 사항이 될 수 있다고 말합니다.

-?의 경우 두 숫자 부분이 모두 존재하지 않을 경우 -이되지만 숫자 부분이 모두있는 경우 1 -이되므로 다시 선택 사항이됩니다.

(\d{9})?에 대해서도 마찬가지입니다.

그러나 위 패턴은 아무 것도 아닙니다. 나는 파이썬을 사용하고 있으므로 group(1)group(2)은 모두 None이다.

위의 사항에 문제가 있습니까?

답변

2

문제는 처음에는 .+입니다. Regex 인터프리터는 .+이 종료되어야 할 때를 추론 할 수 없습니다. 따라서 패턴은 사실 일치하지만 일치 그룹은 항상 이미 관찰 한대로 None입니다. 대신

(\d{5})?\-?(\d{9})?$ 

을 사용하면 모든 예제와 일치하며 일치하는 그룹은 올바르게 인식됩니다.

+0

안녕하세요. 작동합니다. 그러나 당신은 그 하이픈을 벗어날 필요가 없다. – lovesh

+1

당신 말이 맞아요. 나는 어쨌든 정규 표현식의 모든 특수 문자를 이스케이프 (escape)하는 습관을 개발했다. 왜냐하면 작동하기 쉽고, 내가 도망쳐 야하는 것에 대해 걱정할 필요가 없기 때문이다 .- –

+0

어떤 문자열이 앞에 있는지 신경 쓰면 게으른 평가를 할 수있다. 숫자의 정규 표현식에'. +?'를 넣는다. – devsnd

관련 문제