2012-09-22 1 views
1
^(?![_\.\'\-])(?:[\p{L} ]+)$ 

,이 :이 정규식이 실패하지 않아야한다고 생각합니다. 무엇이 실종 된 것입니까? 만약 내가 제대로 이해하고

  • (?![_\.\'\-]) 부정적인 내다, 그 밑줄, 점, 아포스트로피 또는 빼기 기호 (임의의 수)로 시작할 수 없습니다 문자열입니다.
  • (?:[\p{L} ]+) Ll, Lm, Lo, Lt 및 Lu와 공백에서 적어도 하나의 문자를 허용합니다.

첫 번째 질문은 : "1Bob"과 같은 것으로 실패하지 않아야합니다 (미리보기 때문에). 그래서 why it fails?

두 번째 질문은 내가 Ll, Lm, Lo, Lt 및 Lu의 문자 목록 또는 설명을 찾을 수있는 곳입니까?

답변

3

숫자 "1"\p{L}과 일치하지 않습니다 (이것은 문자와 일치합니다!). 당신이 어떤 (숫자) 숫자를 일치 시키려면,뿐만 아니라 클래스 \p{N}를 사용

$text = "1Bob"; 

if (preg_match("/^(?![_\.\'\-])(?:[\p{N}\p{L} ]+)$/u", $text)) { 
    echo "Matched!\n"; 
} else { 
    echo "No match...\n"; 
} 

인쇄 할 : 또한

Matched! 

, 루비의 정규식 엔진과 PHP의 사이의 작은 차이가 . 타겟 언어가 PHP 인 것 같기 때문에 Rubular (Ruby)가 아닌 PHP로 테스트하는 것이 좋습니다. preg_match("/^(?![_.'-])(?:[\p{N}\p{L} ]+)$/u", $text)

많은 유니 코드 문자 속성/클래스의 개요는 여기에서 찾을 수 있습니다 : 내부 문자 클래스는, "정상적인"정규식 메타 문자는 어떤 특별한 능력이없는 이스케이프 할 필요가 없다는

주 : http://www.regular-expressions.info/unicode.html

+0

그래서 "1Bob"은 두 번째 그룹이 아니기 때문에 실패합니다. – gremo

+0

@Gremo, correct, 다음과 같이하면됩니다 :'if (preg_match ("/^(?![_\.\'\-))", $ text)) {...}' –

+1

또한, lookahead 문자 클래스에서 모든 백 슬래시를 삭제할 수 있습니다. '/ u' 수식자를 사용해야 할 수도 있습니다. 그래서 유니 코드 프라퍼티가 제대로 작동합니다. –

1
(?![_\.\'\-]) 

(?![_.'-]) 

모와 동일 괄호 안에있는 문자 클래스 내의 st 메타 문자는 이스케이프가 필요하지 않습니다. 대시는 그것이 이해할 수있는 범위의 일부라면 탈출을 요구할 것입니다. 대시는 대괄호로 묶은 문자 클래스의 끝에 있으므로 이스케이프도 필요하지 않습니다.

+0

이 동안 그것이 사실이라면 OP의 질문에 대한 대답이 아닙니다. 그러한 발언은 답변으로 게시되는 대신 질문 아래의 주석으로 더 적합합니다. –

+0

바트 키어 스 - 고맙습니다. 저는 여기 새로 왔습니다. 주석에 형식이 잘못되지 않았습니까 (줄 바꿈을 허용하지 않습니다)? – protist

+0

@protist 잘 알고 있습니다. 이스케이프 할 캐릭터에 대한 빠른 참조가 있습니까? – gremo