2013-03-18 3 views
0

제공된 문자열이 유효한 형식인지 확인하기 위해 식을 만들려고하지만 몇 개월 후에 정규식을 사용하지 않으면 배운 모든 것을 잊어 버리고 다시 배워야합니다. 010L0404FFCCAANFFCC00M000000XXXXXX가 네 개의 구분자는 (L, N은, K, M)를 0-9A-F의 16 진수 범위에서이 arent 고유성 표시하기 의 순서이어야Regex 올바른 순서로 문자열의 PHP에서 구분 기호로

내 발현은 이런 형식과 일치하도록되어 또는 목록에 없습니다. 각 구분 기호는 한 번만 존재할 수 있습니다!

그것은 이것 분해 :

  • 는 단순히 3 개 자리 숫자로 시작은^([0-9] {3}) 항상 필요
  • 번째 세트는 L로 시작 및 + 2 자리 + 6 16 진 2 자리 수와
  • 제 3 세트는 N 시작 선택적이며 6 자리의 16 진이어야하며
  • K 단순히 숫자의 양은 제 4 세트를 선택하고 선택적해야
  • 다섯 번째 세트는 M 그것은 6, 0을 제외한의 배수 여야, 아무것도 표시하지 어떤 6 hexdecimals 또는 XXXXXX 수 있습니다와 같은 336699 (6) 또는 336699XXXXXXFFCC00 (18)와 선택적

내가 그것을 만드는 파악하지 못할 가장 어려운 부분 그 순서대로 필요하고, L 분리 문자가 앞에 와야하고, K가 항상 존재한다면 (여러 이유 때문에 분리 문자로 동일한 것을 의미하는 동일한 문자열을 변형하지 않는 이유) 배수가 필요합니다. 이미 구문 분석 할 수 있습니다. 문자열이 올바른 형식인지 확인하고 싶습니다.

감사합니다. 감사드립니다.

답변

1

주문을 요구하는 것은 그렇게 나쁘지 않습니다. 각 세트를 선택적으로 만드십시오. 정규식은 여전히 ​​순서대로 일치하므로 예를 들어 L 섹션이없고 다음 문자가 N 인 경우 나머지 정규식과 일치하지 않기 때문에 나중에 L 섹션이 나오지 않습니다.

나는 귀하의 요구 사항의 직접적인 번역 될 것이라고 생각하지 :

^([0-9]{3})(L[0-9]{4}[0-9A-F]{6})?(N[0-9A-F]{6})?(K[0-9]+)?(M([0-9A-F]{6}|X{6})+)?$ 

없음 실제 트릭을 그냥 처음 세 자리를 제외하고 각 그룹이 선택하고, 6 자리의 두 가지 패턴을 내부 대안을 추가 M 블록에.

+0

바보처럼 느껴집니다. 도움. 누구나 읽을 수있는 약간의 오타 M ([0-9A-Z])은 M ([0-9A-F] –

+0

Ack, 감사합니다. 편집 됨)이어야합니다. – rra

1
^([0-9]{3})(L[0-9]{4}[0-9A-F]{6})?(N[0-9A-F]{6})?(K[0-9]+)?(M([0-9A-F]{6})+|MX{6})$ 
+0

예를 들어 336699XXXXXXFFCC00을 간과했습니다. 오 잘. – minopret

+0

M 그룹에 대해 6의 배수를 적용하기 위해 regex를 지정하는 방법이 있습니까? –

+0

예, M 그룹은 @rra가 이미 가지고있는 것과 똑같이 할 수 있습니다 :'(M ([0-9A-F] {6} | X {6}) +)?) – minopret

관련 문제