Nice programing

문자열에서 대문자가 연속적으로 발견되는지 확인하는 정규식?

nicepro 2020. 11. 22. 20:32
반응형

문자열에서 대문자가 연속적으로 발견되는지 확인하는 정규식?


다음 경우에 대한 정규식을 알고 싶습니다.

문자열에는 알파벳 문자 만 포함되어야합니다. 대문자로 시작하고 그 뒤에 소문자가 와야합니다. 그런 다음 소문자 또는 대문자가 될 수 있습니다.

^[A-Z][a-z][A-Za-z]*$

그러나 문자열에는 연속 된 대문자도 포함되지 않아야합니다. 해당 논리를 정규 표현식에 어떻게 추가합니까?

HttpHandler, 맞지만 HTTPHandler틀 렸습니다.


편집 : 2015-10-26 : 찬성 해 주셔서 감사합니다. 그러나 특히 웹이나 더 많은 "국제"용으로 개발하는 경우 tchrist의 답변을 살펴보십시오 .

Oren Trutners 답변이 옳지 않습니다 (일치해야하지만 일치하지 않는 "RightHerE"의 샘플 입력 참조).

올바른 해결책은 다음과 같습니다.

(?!^.*[A-Z]{2,}.*$)^[A-Za-z]*$

편집하다:

(?!^.*[A-Z]{2,}.*$)  // don't match the whole expression if there are two or more consecutive uppercase letters
^[A-Za-z]*$          // match uppercase and lowercase letters

/편집하다

솔루션의 핵심은 부정적인 전망입니다. http://www.regular-expressions.info/lookaround.html


때마다 하나 개의 쓰기 [A-Z][a-z], 처리 아무것도하지만 7 비트 ASCII 데이터를 하나의 커밋. 정말 괜찮다면 괜찮습니다. 그러나 그렇지 않은 경우 유니 코드 속성이 존재합니다.

유니 코드에는 두 가지가 아닌 세 가지 경우가 있습니다. 또한 대소 문자가없는 문자도 있습니다. 일반적으로 문자는 \pL속성에 의해 지정되며 문자 는 5 개의 하위 범주 중 정확히 하나에 속합니다.

  1. 지정되는 대문자\p{Lu} ; 예 :AÇDZÞΣSSὩΙST
  2. 지정되는 제목 케이스 문자\p{Lt} ; 예 : LjDzSsᾨSt(사실 SsSt대문자 다음 소문자 문자,하지만 그들이 있는 당신의 타이틀 케이스를 요청할 경우에 당신이 무엇을 얻을 ß각각)
  3. 지정되는 소문자\p{Ll} ; 예 :aαçdzςσþßᾡſt
  4. 지정되는 수정 자 문자\p{Lm} ; 예 :ʰʲᴴᴭʺˈˠᵠꜞ
  5. 지정된 다른 문자\p{Lo} ; 예 :ƻאᎯᚦ京

당신은 할 수 같은 것이 있기 때문에, 이들의의 보수를 가지고,하지만 조심 \P{Lu}않습니다 되지 대문자되지 않은 편지를 의미한다. 대문자가 아닌 모든 문자를 의미합니다.

대문자 또는 제목 중 하나 인 문자의 경우 [\p{Lu}\p{Lt}]. 따라서 패턴에 사용할 수 있습니다.

      ^([\p{Lu}\p{Lt}]\p{Ll}+)+$

첫 번째 뒤에 오는 문자를 대소 문자 만 제한하지 않으려는 경우 다음을 선호 할 수 있습니다.

     ^([\p{Lu}\p{Lt}][\p{Ll}\p{Lm}\p{Lo}]+)+$

소위 "CamelCase"식별자를 일치시키려는 경우 실제 규칙은 프로그래밍 언어에 따라 다르지만 일반적으로 밑줄 문자와 십진수 ( \p{Nd})를 포함하고 리터럴 달러 기호를 포함 할 수 있습니다. 그렇다면 위의 두 문자 클래스 중 하나 또는 다른 하나에 이들 중 일부를 추가 할 수 있습니다. 예를 들어, 둘 다에 밑줄을 추가하고 초에는 숫자 만 추가 할 수 있습니다.

     ^([_\p{Lu}\p{Lt}][_\p{Nd}\p{Ll}\p{Lm}\p{Lo}]+)+$

하지만 다양한 RFC 및 ISO 표준의 특정 단어를 다루는 경우 이러한 단어는 종종 ASCII 만 포함하는 것으로 지정됩니다. 그렇다면 문자 그대로 [A-Z]아이디어를 얻을 수 있습니다 . 실제로 존재하지 않는 경우 그러한 제한을 부과하는 것은 친절하지 않습니다.


^([A-Z][a-z]+)+$

이것은 하나 이상의 소문자가 뒤 따르는 대문자 시퀀스를 찾습니다. 연속 된 대문자는 한 번에 하나만 허용되므로 일치하지 않으며 그 뒤에 소문자가 와야합니다.


유니 코드에 관한 tchrists의 우수한 게시물을 제외하고는 부정적인 예측을 가진 복잡한 솔루션이 필요하지 않다고 생각합니다. 정의에는 대문자 다음에 적어도 하나의 그룹이 필요합니다 (소문자는 선택적으로 대문자로 이어짐) )

^
[A-Z]    // Start with an uppercase Letter
(        // A Group of:
  [a-z]  // mandatory lowercase letter
  [A-Z]? // an optional Uppercase Letter at the end
         // or in between lowercase letters
)+       // This group at least one time
$

좀 더 콤팩트하고 읽기 쉬운 것 같아요 ...


이 쿼리를 적용하는 것보다 적어도 하나의 대문자가있는 mysql에서 모든 직원 이름을 얻으려면.

SELECT * FROM registration WHERE `name` REGEXP BINARY '[A-Z]';

참고 URL : https://stackoverflow.com/questions/4050381/regular-expression-for-checking-if-capital-letters-are-found-consecutively-in-a

반응형