[javascript] 악센트 문자에 대한 구체적인 Javascript 정규식 (이분법)

Stack Overflow ( 문자 교체 .. eh , JavaScript가 RegExp 등에 관한 유니 코드 표준을 따르지 않는 방법 등)를 살펴본 결과 질문에 대한 구체적인 답을 찾지 못했습니다.

How can JavaScript match for accented characters (those with diacritical marks)?

UI의 필드를 형식 : last_name, first_name (마지막 [쉼표 공간] 먼저) 과 일치 시키 도록 발음하고 분음 부호를 지원하려고하지만 JavaScript에서는 다른 언어 / 플랫폼보다 조금 더 어렵습니다.

분음 부호 지원을 추가 할 때까지 이것은 원래 버전이었습니다.

/^[a-zA-Z]+,\s[a-zA-Z]+$/

현재 지원을 추가하는 세 가지 방법 중 하나에 대해 토론 중입니다. 모두 테스트하고 작동했습니다 (적어도 어느 정도 “범위”가 두 번째 접근법인지는 알지 못합니다). 여기 있습니다:

유효한 것으로 받아들이고 자하는 모든 악센트 문자 (명확하고 지나치게 복잡함)를 명시 적으로 나열합니다.


var accentedCharacters = "àèìòùÀÈÌÒÙáéíóúýÁÉÍÓÚÝâêîôûÂÊÎÔÛãñõÃÑÕäëïöüÿÄËÏÖÜŸçÇßØøÅåÆæœ";
// Build the full regex
var regex = "^[a-zA-Z" + accentedCharacters + "]+,\\s[a-zA-Z" + accentedCharacters + "]+$";
// Create a RegExp from the string version
regexCompiled = new RegExp(regex);
// regexCompiled = /^[a-zA-ZàèìòùÀÈÌÒÙáéíóúýÁÉÍÓÚÝâêîôûÂÊÎÔÛãñõÃÑÕäëïöüÿÄËÏÖÜŸçÇßØøÅåÆæœ]+,\s[a-zA-ZàèìòùÀÈÌÒÙáéíóúýÁÉÍÓÚÝâêîôûÂÊÎÔÛãñõÃÑÕäëïöüÿÄËÏÖÜŸçÇßØøÅåÆæœ]+$/
  • 이것은에서 지원되는 악센트 부호 문자로 성 / 이름을 정확하게 일치 accentedCharacters시킵니다.

다른 접근법은 .문자 클래스 를 사용하여 더 간단한 표현을하는 것입니다.

var regex = /^.+,\s.+$/;
  • 이것은 적어도 다음과 같은 형식으로 거의 일치합니다 something, something. 괜찮습니다.

방금 찾은 마지막 접근 방식 이 더 간단 할 수 있습니다 …

/^[a-zA-Z\u00C0-\u017F]+,\s[a-zA-Z\u00C0-\u017F]+$/
  • 그것은 테스트하고 작동하는 다양한 유니 코드 문자와 일치하지만, 미친 짓을 시도하지는 않았지만 교수진의 이름을 위해 언어 부서에서 볼 수있는 일반적인 것들입니다.

내 관심사는 다음과 같습니다.

  1. 첫 번째 해결책은 너무 제한적이며, 느슨하고 복잡합니다. 한두 글자를 잊어 버린 경우에는 변경해야하는데 이는 실용적이지 않습니다.
  2. 두 번째 해결책은 더 낫고 간결하지만 실제로 실제보다 훨씬 더 일치합니다. 나는에 실제 문서를 찾을 수 없습니다 정확히 무엇을 .일치, (온 테이블에서 “개행 문자를 제외한 모든 문자”단지 일반화 MDN을 ).
  3. 세 번째 해결책이 가장 정확한 것처럼 보이지만 문제가 있습니까? 나는 적어도 실제로, 유니 코드를 잘 알고 아니에요,하지만보고 코드 표 / 그 테이블의 계속 , \u00C0-\u017F적어도 내 예상 입력, 꽤 단단한 것 같다.

    • 교수진은 모국어 (예 : 아랍어, 중국어, 일본어 등)로 이름을 가진 양식을 제출하지 않으므로 라틴 문자 이외의 문자 집합에 대해 걱정할 필요가 없습니다.

따라서 실제 질문 :이 세 가지 접근법 중 어떤 것이 작업에 가장 적합합니까? 아니면 더 나은 솔루션이 있습니까?



답변

모든 악센트를 받아들이는 가장 쉬운 방법은 다음과 같습니다.

[A-zÀ-ú] // accepts lowercase and uppercase characters
[A-zÀ-ÿ] // as above but including letters with an umlaut (includes [ ] ^ \ × ÷)
[A-Za-zÀ-ÿ] // as above but not including [ ] ^ \
[A-Za-zÀ-ÖØ-öø-ÿ] // as above but not including [ ] ^ \ × ÷

숫자 순서로 나열된 문자는 https://unicode-table.com/en/ 을 참조 하십시오 .


답변

악센트가 붙은 라틴어 범위 \u00C0-\u017F는 내 이름 데이터베이스에 충분하지 않으므로 정규 표현식을

[a-zA-Z\u00C0-\u024F]
[a-zA-Z\u00C0-\u024F\u1E00-\u1EFF] // includes even more Latin chars

이 코드 블록을 추가 \u00C0-\u024F했습니다 (한 번에 세 개의 인접한 블록 포함).

참고 \u00C0-\u00FF실제로 단지 일부 라틴 1 보충 . 이 범위는 인쇄 불가능한 제어 신호와 어색하게 배치 된 곱하기 × \u00D7및 나누기 ÷를 제외한 모든 기호를 건너 뜁니다 \u00F7.

[a-zA-Z\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u024F] // exclude ×÷

더 많은 코드 포인트가 필요하면 Wikipedia의 유니 코드 문자 목록 에서 더 많은 범위를 찾을 수 있습니다 . 예를 들어 Latin Extended-C , DE를 추가 할 수도 있지만 지금은 역사학 자만 관심을 갖고 D 및 E 세트가 브라우저에서 올바르게 렌더링되지 않기 때문에 제외했습니다.

원래 정규 표현식 \u017F은 “Șenol”이라는 이름으로 시작됩니다. 에 따르면 FontSpace의 유니 코드 분석기 , 그 최초의 문자는 \u0218, 아래의 라틴 대문자 S WITH COMMA. (예, 보통 세 \u015E디야 (Cedilla -S) , “세놀 (Senol)”로 표시됩니다. 그러나 나는 터키로 날아가서 “당신의 이름을 잘못 입력하고 있습니다!”)


답변

이 세 가지 방법 중 어떤 것이 작업에 가장 적합합니까?

작업에 따라 다릅니다 🙂 모든 라틴 문자와 강조된 버전을 정확하게 일치시키기 위해 유니 코드 범위는 아마도 최상의 솔루션을 제공 할 것입니다. 공백이 아닌 모든 문자로 확장 될 수 있으며 \S문자 클래스를 사용하여 수행 할 수 있습니다 .

UI의 필드가 형식과 일치하도록 강제합니다. last_name, first_name(마지막 [쉼표 공간])

여기에서 가장 기본적인 문제는 분음 부호가 아니라 공백입니다. 제목과 같이 여러 단어로 구성된 몇 가지 이름이 있습니다. 따라서 가장 일반적인 이름을 사용해야합니다. 즉 성을 제외한 쉼표를 제외한 모든 것을 허용합니다.

/[^,]+,\s[^,]+/

그러나 .문자 클래스가 있는 두 번째 솔루션 은 훌륭하지만 여러 쉼표 만 신경 쓰면됩니다.


답변

XRegExp의 라이브러리가 유니 코드라는 이름의 플러그인 이 같은 작업을 해결하는 데 도움이됩니다.

<script src="xregexp.js"></script>
<script src="addons/unicode/unicode-base.js"></script>
<script>
  var unicodeWord = XRegExp("^\\p{L}+$");

  unicodeWord.test("Русский"); // true
  unicodeWord.test("日本語"); // true
  unicodeWord.test("العربية"); // true
</script>

질문에 대한 의견에서 언급되었지만 놓치기 쉽습니다. 이 답변을 제출 한 후에 만 ​​알았습니다.


답변

이건 어때요?

/^[a-zA-ZÀ-ÖØ-öø-ÿ]+$/


답변

이건 어때?

^([a-zA-Z]|[à-ú]|[À-Ú])+$

모든 단어를 악센트 부호가있는 문자와 일치 시키거나 일치시키지 않습니다.


답변

이 위키에서 : https://ko.wikipedia.org/wiki/List_of_Unicode_characters#Basic_Latin

라틴 문자의 경우

/^[A-zÀ-ÖØ-öø-ÿ]+$/ 

하이픈과 특수 문자를 피합니다.