복붙노트

[RUBY-ON-RAILS] 어떻게 정규식과 악센트 문자와 일치 하는가?

RUBY-ON-RAILS

어떻게 정규식과 악센트 문자와 일치 하는가?

나는 레일 3.0.10과 루비 1.9.2에 루비를 실행하고 있습니다. 나는 일치하는 이름을 위하여 다음과 같은 정규식을 사용하고 있습니다 :

NAME_REGEX = /^[\w\s'"\-_&@!?()\[\]-]*$/u

validates :name,
  :presence   => true,
  :format     => {
    :with     => NAME_REGEX,
    :message  => "format is invalid"
  }

그러나, 나는 다음과 같은 몇 가지 단어를 저장하려고하는 경우 :

Oilalà
Pì
Rùby
...

# In few words, those with accented characters

내가 유효성 검사 오류 "이름의 형식이 올바르지 않습니다이 ..

어떻게 정규식 위는 그래서 A, E, E,, O, ù처럼도 악센트 문자에 맞게 변경할 수 있습니다 ...?

해결법

  1. ==============================

    1.대신에 \ w는 POSIX 브래킷 식 사용 [: 알파 :] :

    대신에 \ w는 POSIX 브래킷 식 사용 [: 알파 :] :

    "blåbær dèjá vu".scan /[[:alpha:]]+/  # => ["blåbær", "dèjá", "vu"]
    
    "blåbær dèjá vu".scan /\w+/  # => ["bl", "b", "r", "d", "j", "vu"]
    

    특정 경우에,이에 정규식을 변경 :

    NAME_REGEX = /^[[:alpha:]\s'"\-_&@!?()\[\]-]*$/u
    

    이것은 비록 더 많은 단지 악센트 부호가있는 문자보다 훨씬 일치 않습니다. 이는입니다 좋은 것. 반드시 일반적인 오해에 대한이 블로그 항목을 읽을 수 있는지 확인 소프트웨어 응용 프로그램의 이름에 대한.

  2. ==============================

    2.나는 그들이 상당히 많은 수 있습니다 생각하지만 하나 개의 솔루션은 물론, 단순히 그들 모두가 당신이 평소처럼 사용할 발견하는 것입니다.

    나는 그들이 상당히 많은 수 있습니다 생각하지만 하나 개의 솔루션은 물론, 단순히 그들 모두가 당신이 평소처럼 사용할 발견하는 것입니다.

    당신이 UTF8을 사용하는 경우에 당신은 같은 문자가 자주 또한 결합 문자라고 (내가 믿는 0x0300과 0x0301) 악센트 다음 두 부분으로, "기본"문자 자체로 분할되는 것을 발견 할 것이다. 일부 문자는 또한 "하드 코딩"문자 코드를 사용하여 작성 될 수 있기 때문에 먼저 NFD의 형태로 UTF8 문자열을 정상화 할 필요가 있으므로 그러나이 항상 ... 진실하지 않을 수 있습니다.

    물론, 당신은 또한 당신이 UTF8로 다음 다시 원래의 캐릭터 세트에있는 모든 문자열을 돌 수 있었다 ...하지만 당신은 대량 작업을 수행하는 경우 오버 헤드가 매우 커질 수 있습니다.

    편집 : 당신이 같은 점으로 (허용 할 어떤 다른 문자를 결합하여 최적의 솔루션이 UTF8의 NPD의 형태로 문자열을 정상화 가능성이 구체적으로 귀하의 질문에 대답하고 단순히 허용되는 문자의 목록에 0x0300과 0x0301를 추가하려면 AAO, 당신은 윈도우, 0x0300을보고 "최대")의 "문자표"에 그들 모두를 찾을 수 있습니다.

  3. from https://stackoverflow.com/questions/7292395/how-to-match-accented-characters-with-a-regex by cc-by-sa and MIT license