2013-02-26 3 views
7

모든 한 자리 숫자의 텍스트를 찾아야합니다.regex : 한 자리 숫자 찾기

내 코드 :

$string = 'text 4 78 text 558 [email protected] 5 text 78998 text'; 
$pattern = '/ [\d]{1} /'; 

(결과 : 4, 5)

모든 것이 그냥 공간을 사용하는 것이 올바른 물어보고 싶은게, 완벽하게 작동? 한 자리 숫자를 구별하는 다른 방법이있을 수 있습니다. 단어 경계 주위

감사

+0

당신 여기에 몇 가지 특별한 경우가 누락되었습니다. 숫자가 처음과 끝 부분에 있고 문자열의 한 자리 숫자 일 때. – abc667

답변

12

우선, [\d]{1}\d는 동일하다.

귀하의 질문에 대해서는 lookbehind/lookahead 또는 단어 경계 (\b)와 같은 제로 너비 어설 션을 사용하는 것이 좋습니다. 그렇지 않으면 두 번째 숫자의 선행 공백이 첫 번째 숫자의 후행 공백으로 일치하므로 중복되는 한자리 숫자와 일치하지 않습니다. 여기

내가이에 다음과 같이 쓸 수있다 :

이 "그 전에 공백이 아닌 문자가없고, 공백이 아닌 문자가 뒤에가없는 경우에만 숫자 일치"를 의미
(?<!\S)\d(?!\S) 

.

(?=\s) 대신 (?!\S)처럼 이중 음수를 사용 했으므로 문자열의 시작 또는 끝에있는 하나의 숫자도 일치시킵니다. 당신이 정말로 유일한 자리는 공백으로 둘러싸여있을 경우이를 일치시킬 및 \b\d\b 허용하려면 192.168.4.5

같은 문자열의 45 일치하는 것처럼 보이기 때문에

나는 당신의 예를 들어 \b\d\b 이상이 선호

(?<!\S)\d(?![^\s.,?!]) 

당신이 대괄호 안에 문자 클래스로 자리 (이후에 허용 할 추가 문장 부호 문자를 추가하지만 일 이후 확인 : 마지막 문장은 다음과 같은 사용할 수 있습니다 e ^).

+0

불행히도 마지막 RegEx는 Edge 또는 Firefox에서 작동하지 않고 Chrome 만 – Dan

3

검색 :

다른 사람에 의해 설명 된 바와 같이
\b\d\b 

이 일부 특수 문자처럼 존중하지 않을 수 있음을 의미 한 자리를 추출합니다 "." IP 주소에서. 이 문제를 해결하려면 F.J와 Mike Brant의 답변을 참조하십시오.

10

word boundaries을 사용하십시오. 범위 한정 기호 {1} (단 하나의 \d은 한 자릿수와 만 일치 함) 및 문자 클래스 []은 하나의 문자로만 구성되기 때문에 중복됩니다. 모든

\b\d\b 
0

숫자가 나타날 수있는 위치와 문장이 다른 문자 (예 : 문장의 끝에 .)와 인접한 경우 신경을 쓰느냐에 달려 있습니다.당신은 입력 문자열의 시작과 끝에 숫자를 얻을 수 있도록 적어도, 나는 단어 경계를 사용합니다 :

$pattern = '/\b\d\b/'; 

하지만 당신은 같은 말에 구두점을 고려해 볼 수 있습니다 :

$pattern = '/\b\d(\b|\.|\?|\!)/';