[regex] 성과 이름에 대한 정규식

웹 사이트 확인을 위해 이름과 성 확인이 필요합니다.

이름의 경우 문자 만 포함해야하며 공백이있는 여러 단어 일 수 있으며 최소 3 자이지만 최대 30 자까지 가능합니다. 빈 문자열은 유효성을 검사하지 않아야합니다 (예 : Jason , jason , jason smith , jason smith , JASON , Jason smith , jason Smith , jason SMITH ).

성의 경우 3 자 이상 30 자 이하의 문자로만 된 단일 단어 여야합니다. 빈 문자열은 유효성을 검사하지 않아야합니다 (예 : lazslo , LazsloLAZSLO ).



답변

다음과 같은 이름을 잊지 마세요.

  • 마티아스 다 라스
  • 마틴 루터 킹 주니어
  • 헥터 소시지-하우젠

이것은 대부분의 경우에 트릭을 수행합니다.

/^[a-z ,.'-]+$/i

또는 매우 달콤한 유니 코드로 국제 이름 지원 :

/^[a-zA-ZàáâäãåąčćęèéêëėįìíîïłńòóôöõøùúûüųūÿýżźñçčšžÀÁÂÄÃÅĄĆČĖĘÈÉÊËÌÍÎÏĮŁŃÒÓÔÖÕØÙÚÛÜŲŪŸÝŻŹÑßÇŒÆČŠŽ∂ð ,.'-]+$/u


답변

이름과 성의 형식에 대해 잘못된 가정을합니다. 이름이 비어 있는지 확인하는 것 외에는 이름을 전혀 확인하지 않는 것이 좋습니다.


답변

이 모든 답변을 살펴본 후 대부분의 언어를 지원하고 단어 문자 만 허용하는 작은 정규식을 빌드하는 방법을 찾았습니다. 하이픈, 공백 및 아포스트로피와 같은 일부 특수 문자도 지원합니다. 나는 파이썬에서 테스트했으며 아래 문자를 지원합니다.

^[\w'\-,.][^0-9_!¡?÷?¿/\\+=@#$%ˆ&*(){}|~<>;:[\]]{2,}$

지원되는 문자 :

abcdefghijklmnopqrstwxyz
ABCDEFGHIJKLMNOPQRSTUVWXYZ
áéíóúäëïöüÄ'
陳大文
łŁőŐűŰZàáâäãåąčćęèéêëėįìíîïłńòóôöõøùúûüųū
ÿýżźñçčšžÀÁÂÄÃÅĄĆČĖĘÈÉÊËÌÍÎÏĮŁ
ŃÒÓÔÖÕØÙÚÛÜŲŪŸÝŻŹÑßÇŒÆČŠŽ.-
ñÑâê都道府県Федерации
আবাসযোগ্য জমির걸쳐 있는


답변

이름을 처리하기 위해 사용자 지정 정규식을 만들었습니다.

나는 이러한 유형의 이름을 시도하고 완벽하게 작동하는 것을 발견

  1. 존 스미스
  2. 존 D’ Largy
  3. John Doe-Smith
  4. John Doe Smith
  5. 헥터 소시지-하우젠
  6. 마티아스 다 라스
  7. 마틴 루터 킹
  8. 아이 웡
  9. 차오 창
  10. 알츠 베타 바라

내 RegEx는 다음과 같습니다.

^([a-zA-Z]{2,}\s[a-zA-Z]{1,}'?-?[a-zA-Z]{2,}\s?([a-zA-Z]{1,})?)

MVC4 모델 :

[RegularExpression("^([a-zA-Z]{2,}\\s[a-zA-Z]{1,}'?-?[a-zA-Z]{2,}\\s?([a-zA-Z]{1,})?)", ErrorMessage = "Valid Charactors include (A-Z) (a-z) (' space -)") ]

\\이스케이프 문자의 경우 이중 을 참고하십시오.

RegEx를 처음 사용하는 분들을 위해 설명을 포함하겠습니다.

^               // start of line
[a-zA-Z]{2,}    // will except a name with at least two characters
\s              // will look for white space between name and surname
[a-zA-Z]{1,}    // needs at least 1 Character
\'?-?           // possibility of **'** or **-** for double barreled and hyphenated surnames
[a-zA-Z]{2,}    // will except a name with at least two characters
\s?             // possibility of another whitespace
([a-zA-Z]{1,})? // possibility of a second surname


답변

나는 그것을 검색하고, 검색하고, 연주하고, 놀았으며, 완벽하지는 않지만 다른 사람들이 하나의 변수로 제공된 성과 이름을 확인하려고 시도하는 데 도움이 될 수 있습니다.

제 경우에는 그 변수가 $ name입니다.

내 PHP에 다음 코드를 사용했습니다.

    if (preg_match('/\b([A-Z]{1}[a-z]{1,30}[- ]{0,1}|[A-Z]{1}[- \']{1}[A-Z]{0,1}
    [a-z]{1,30}[- ]{0,1}|[a-z]{1,2}[ -\']{1}[A-Z]{1}[a-z]{1,30}){2,5}/', $name)
    # there is no space line break between in the above "if statement", any that   
    # you notice or perceive are only there for formatting purposes.  
    # 
    # pass - successful match - do something
    } else {
    # fail - unsuccessful match - do something

RegEx를 직접 배우고 있지만 RegEx 친구가 제공 한 코드에 대한 설명이 있습니다.
여기있어:

단어 경계«\ b»에서 위치 지정

아래 정규 표현식을 일치시키고 일치하는 항목을 역 참조 번호 1로 캡처
«([AZ] {1} [az] {1,30} [-] {0,1} | [AZ] {1} [-\ ‘] { 1} [AZ] {0,1} [az] {1,30} [-] {0,1} | [az] {1,2} [-\ ‘] {1} [AZ] {1} [ az] {1,30}) {2,5}»

2 ~ 5 회, 최대한 많이, 필요한만큼 돌려주기 (욕심)«{2,5}»

* 이 노트의 예의를 이해하는 데 도움이 필요합니다 *

참고 : 캡처 그룹 자체를 반복했습니다. 그룹은 마지막 반복 만 캡처합니다. 반복 된 그룹 주위에 캡처 그룹을 배치하여 모든 반복을 캡처합니다. «{2,5}»

아래 정규식 중 하나와 일치 (실패한 경우에만 다음 대체 시도)«[AZ] {1} [az] {1,30} [-] {0,1}»

“A”와 “Z”«[AZ] {1}»범위의 단일 문자와 일치

정확히 1 회«{1}»

“a”와 “z”사이의 범위에서 단일 문자 일치«[az] {1,30}»

1 ~ 30 회, 가능한 한 많이, 필요에 따라 환원 (욕심)«{1,30}»

목록“-”«[-] {0,1}»에있는 단일 문자와 일치

0 ~ 1 회, 가능한 한 많이, 필요한만큼 돌려주기 (욕심)«{0,1}»

또는 아래의 정규식 2 번과 일치 (실패한 경우에만 다음 대안 시도)«[AZ] {1} [-\ ‘] {1} [AZ] {0,1} [az] {1,30} [ -] {0,1}»

“A”와 “Z”«[AZ] {1}»범위의 단일 문자와 일치

정확히 1 회«{1}»

아래 목록에있는 단일 문자 일치«[-\ ‘] {1}»

정확히 1 회«{1}»

문자 “-“«-»A ‘문자«\’»중 하나

“A”와“Z”«[AZ] {0,1}»사이의 범위에서 단일 문자를 찾습니다.

0 ~ 1 회, 가능한 한 많이, 필요한만큼 돌려주기 (욕심)«{0,1}»

“a”와 “z”사이의 범위에서 단일 문자 일치«[az] {1,30}»

1 ~ 30 회, 가능한 한 많이, 필요에 따라 환원 (욕심)«{1,30}»

목록“-”«[-] {0,1}»에있는 단일 문자와 일치

0 ~ 1 회, 가능한 한 많이, 필요한만큼 돌려주기 (욕심)«{0,1}»

또는 아래 정규식 번호 3과 일치합니다 (일치하지 못하면 전체 그룹이 실패 함)«[az] {1,2} [-\ ‘] {1} [AZ] {1} [az] {1,30} »

“a”와 “z”사이의 범위에서 단일 문자 일치«[az] {1,2}»

1 ~ 2 회, 최대한 많이, 필요에 따라 환원 (욕심)«{1,2}»

“”및“ ‘”«[-\’] {1}»범위의 단일 문자와 일치

정확히 1 회«{1}»

“A”와 “Z”«[AZ] {1}»범위의 단일 문자와 일치

정확히 1 회«{1}»

“a”와 “z”사이의 범위에서 단일 문자 일치«[az] {1,30}»

1 ~ 30 회, 가능한 한 많이, 필요에 따라 환원 (욕심)«{1,30}»

이 검증은 양식을 작성하는 모든 사람이 서양식 이름을 가지고 있으며 전 세계에서 대다수의 사람들을 제거 할 수 있다고 전적으로 가정합니다. 그러나 이것이 올바른 방향으로 나아가는 단계라고 생각합니다. 아마도이 정규식은 전문가가 단순하게 다루기에는 너무 기본적이거나 내 검색에서 위의 코드를 찾을 수없는 다른 이유가있을 수 있습니다. 나는이 부분을 알아 내기 위해 너무 오랜 시간을 보냈다. 아래의 내 테스트 이름을 보면 내 마음이이 모든 것에 얼마나 흐릿한 지 알 수있을 것이다.

다음 이름에 대한 코드를 테스트했으며 결과는 각 이름의 오른쪽에 괄호 안에 있습니다.

  1. STEVE SMITH (실패)
  2. Stev3 Smith (실패)
  3. STeve Smith (실패)
  4. Steve SMith (실패)
  5. Steve Sm1th (Steve Sm에 전달됨)
  6. d’ Are to Beaware (Are to Beaware에서 전달됨)
  7. 조 블로우 (통과)
  8. 우형 경 (통과)
  9. Mike O’Neal (통과)
  10. Steve Johnson-Smith (통과)
  11. Jozef-Schmozev Hiemdel (통과)
  12. O Henry Smith (통과)
  13. Mathais d’ Arras (통과)
  14. 마틴 루터 킹 주니어 (통과)
  15. 다운타운 제임스 브라운 (통과)
  16. Darren McCarty (통과)
  17. George De FunkMaster (통과)
  18. Kurtis B-Ball 농구 (통과)
  19. Ahmad el Jeffe (통과)

기본 이름이있는 경우 위의 코드가 작동하려면 1 ~ 5 개 이상이어야합니다. 테스트 중에 사용한 것과 비슷합니다.이 코드가 적합 할 수 있습니다.

개선 사항이 있으면 알려주십시오. 저는 초기 단계에 있습니다 (RegEx를 파악한 후 처음 몇 달.

감사합니다. 행운을 빕니다, 스티브


답변

이름은

"([a-zA-Z]{3,30}\s*)+"

전체 이름 부분이 30 자 미만이어야한다면 별도로 확인해야한다고 생각합니다. 표현 ".{3,30}"은 그렇게해야합니다.

성 요구 사항은 다음과 같이 번역됩니다.

"[a-zA-Z]{3,30}"

하지만 이것들을 확인해야합니다. 공백이 포함 된 성이 많이 있습니다.


답변

maček이 말했듯이 :

다음과 같은 이름을 잊지 마세요.

마티아스 다 라스

마틴 루터 킹 주니어

헥터 소시지-하우젠

다음과 같은 경우를 제거합니다.

.. 마티아스

마틴 킹 주니어-

여기에는 더 많은 경우가 포함됩니다.

^([a-z]+[,.]?[ ]?|[a-z]+['-]?)+$