2011-10-26 2 views
4

문자열 객체의 search() 메서드를 사용하여 정규 표현식과 문자열 간의 일치를 찾습니다.자바 정규식 및 일본어 기호

"google".search(/\bg/g) // return 0 

하지만이 코드는 일본어 문자열을 작동하지 않습니다 :

그것은 영어 단어 잘 작동

"アイスランド語".search(/\bア/g) // return -1 

가 어떻게 일본 문자열 사이의 일치를 찾기 위해 정규식을 변경할 수 있습니다 정규식?

답변

4

슬프게도 자바 스크립트는 "ASCII 전용"정규식입니다. 유니 코드가 지원되지 않습니다. 유니 코드 비 ASCII 문자가 "클래스로 나뉘어지지 않았습니다"라는 의미이므로, 예를 들어 \d은 0-9입니다. Javascript에서 고급 정규 표현식 (유니 코드 정규식)이 필요하면 시도해 볼 수 있습니다 http://xregexp.com/

그리고 우리는 서로 게이트 쌍의 문제를 조사하지 않습니다. Javascript의 문자는 UTF-16 포인트이므로 항상 "전체"유니 코드 문자는 아닙니다. 다행스럽게도 일본어는 BMP에 포함되어야합니다 (단, Han unification은 Plane 2에 있으므로 각 문자는 2x UTF-16 문자입니다)

유니 코드에 대해 알고 싶다면 예를 들어, 위키 Mapping of Unicode characters.

+0

답장을 보내 주셔서 감사합니다. 내 regexp를 변경하고 제 3 자 JS 라이브러리 (xregexp.com)를 사용하지 않는 방법이 있습니까? – Andrei

+1

@Andrei 기술적으로이 "언어".search (/^아/g)'가 작동합니다. (귀하의 제한적인 예에서). 그러나 그것은 당신이 원했던 것이 아닙니다 :-) Javascript는 너비가 0으로 되돌아 가지 않기 때문에 더 복잡합니다. (다른 언어에서는'? <=^| [,.; : /() -])'이는 캐릭터 앞에 문자열이나 공백 또는','등의 시작을 원한다는 것을 의미합니다) – xanatos

3

문제는 \b입니다. \b으로 만 일치 : 문자열의 첫 번째 문자 전에

  • 를 첫 번째 문자가 단어 문자 인 경우.
  • 문자열의 마지막 문자 다음에 마지막 문자 인 이 단어 문자 인 경우.
  • 문자열의 두 문자 사이에서 은 단어 문자이고 다른 문자는 단어 문자가 아닙니다.

(참조 : http://www.regular-expressions.info/wordboundaries.html를)

그리고 자바 스크립트에서

는 단어 문자는 문자 클래스 [a-zA-Z0-9_] ( ref/워드 경계/ECMA = ASCII)입니다.

+0

답장을 보내 주셔서 감사합니다. – Andrei

+0

예, 이것은 흥미 롭습니다. 비록 Andrei가 좋은 이유가 있다고 확신하기는하지만 \ b ('단어 경계')는 어쨌든 일본어의 맥락에서 의미가없는 것처럼 보입니다. 일반적으로 일본어에는 공백이 없으며 볼 수있는 단어 경계가 무엇인지 알려주는 명확한 알고리즘 방식이 없습니다. 예를 들면 : 우리는 아이랜드의 ご는 が す す 첫 번째는 단어 경계 역할을하지만 나중에 '단어 경계'가 아닌 곳에 같은 문자가 다시 사용됩니다. 단어 경계인지 여부를 결정하기 전에 언어를 구문 분석해야하는 것처럼 보입니다. – PandaWood

+0

@ 팬더 우드 나는 똑같은 생각을 했었지만, 일본 연구의 초심자 인 것처럼, 나는 표면적 지식을 흘리고 싶지 않았다. 제대로 설명 할 수 없었다. ;) – Yoshi