2014-06-15 3 views
0

제목 문자열과 문자 집합과 함께 일부 텍스트가 있습니다. 문자열 문자 집합 뒤에 처음으로 한 자리 숫자를 가져와야합니다.PHP 정규식 문자 집합 후 첫 번째 문자 가져 오기

예 텍스트 :

ABC105001 
ABC205001 
ABC305001 
ABCD105001 
ABCD205001 
ABCD305001 

내 정규식 :

^(\D*)(\d{1})(?=\d*$) 

링크 :http://www.regexr.com/390gv

당신 캔시피, 정규식 괜찮 작동하지만,에서 첫번째 그룹을 캡처 결과도. 이 정수만 가져야하고 입력 할 때 ?= 같은 첫 번째 그룹에 : ^(?=\D*)(\d{1})(?=\d*$), 정규식 작동하지 않습니다.

아이디어가 있으십니까?

미리 감사드립니다.

+0

음 ... '^ \ D * (\ d를 {1}()? = \ d * $)'? – mishik

+0

심지어'^ \ D * (\ d)'입니까? – Qeole

+0

OP가 "ABC0000XXX"와 (과) 일치하지 않겠습니까? – mishik

답변

1

실제로 캡처하지 않는 그룹을 사용하려는 경우 긍정적 인 미리보기를 사용하려고합니다.

이 정규식 작동합니다 원하는 하나의 일치 :

^(?:\D*\d{1})(\d*)$

(?: 문자열이 비 캡처 그룹을 시작합니다. 이것은 경기에서 다시 오지 않을 것입니다.

따라서 일치 항목을 찾으려면 preg_match(';^(?:\D*\d{1})(\d*)$;', $string, $matches)을 사용하면 $matches[1]은 찾고있는 문자열이됩니다. ($matches[0] 항상 preg_match에서 전체 경기가 될 것이기 때문이다.)

+0

이 경우를 시도했지만 어쨌든 문자열 문자를 선택합니다. http://www.regexr.com/390gv – zur4ik

+1

어쨌든 regexr.com highlits 비 캡처 그룹처럼 보이지만 결과 일치가 맞습니다. 감사. – zur4ik

1

시도 :

^(?:\D*)(\d{1})(?=\d*$) // (?: is the beginning of a no capture group 
2

(?=..)가 다음 을 의미하며, 현재 위치의 오른쪽에있는 문자열을 확인하는 내다이다.

(?<=...)앞에이 나오고 현재 위치의 왼쪽에있는 문자열을 확인한다는 의미입니다.

두 가지 기능이 흥미로운 점은 그 내부에서 일치하는 콘텐츠가 전체 경기 결과의 일부가 아니라는 사실입니다. 유일한 문제는 lookbehind가 가변 길이 콘텐츠와 일치 할 수 없다는 것입니다.

문제를 방지 할 수있는 방법이 일치 결과에서 왼쪽을 모두 제거 \K 기능을 사용하는 것입니다

^[A-Z]+\K\d(?=\d*$) 
관련 문제