2015-01-23 5 views
7

libc6의 regexp 기능 regcompregexec을 멀티 바이트 문자로 제대로 작동 시키려면 어쨌든 존재합니까?libc의 멀티 바이트 문자 regcomp 및 regexec

예를 들어, 내 패턴이 utf8 문자 猫机+猫 인 경우 utf8로 인코딩 된 문자열 猫机机机猫에서 일치하는 것이 발견되면 성공할 것입니다.

문자 의 바이트 표현이 \xe6\x9c\xba이고 +이 하나 이상의 바이트 \xba과 일치하기 때문입니다. 이 인스턴스는 패턴의 각 멀티 바이트 문자 주위에 괄호를 넣어서 만들 수 있지만이 패턴은 응용 프로그램 용이므로 사용자가이 작업을 수행하도록 요구할 수는 없습니다.

패턴이나 문자열에 utf8 문자가 포함 된 것으로 일치하도록 플래그를 지정하는 방법이 있습니까? 아마도 libc에 char 대신 wchar으로 패턴을 저장한다고 말하고 있을까요?

+0

멀티 바이트 문자 주위의 팸플릿이 도움이되지 않습니까? – stark

+0

나는 그것을 할 수 있지만, 나는 그런 식으로 패턴을 바꿀 필요가없는 해결책을 기대하고있다. 그래도 감사합니다! 귀하의 의견을 반영하기 위해 질문을 편집했습니다. –

+0

왜 코드 포인트'\ x {nnnnnnn}'을 사용하지 않는 것이 좋을까요? 즉, 정규 표현식 엔진이 유니 코드를 지원해야하는 경우입니다. 보통 정규식과 대상 문자열은 동일한 인코딩을 사용해야하지만 정규식 문자열 내에서 리터럴 유니 코드 문자를 사용하는 것은 좋지 않습니다. 엔진이 그것을 지원하면 바이트 단위가 아닌 char 단위로 char을 읽습니다. – sln

답변

1

정규 표현식을 사용하여 정규 표현식을 작성할 수 있습니까?

function Examp() { 
 
    var uString = "猫机+猫+猫ymg+sah猫"; 
 
    var plussed = uString.replace(/(.)(?=[\+\*])/ig,"($1)"); 
 
    console.log("Starting with string: " + uString + "\r\n" + "Result: " + plussed); 
 
    uString = "猫机+猫*猫ymg+s\\a+I+h猫"; 
 
    plussed = uString.replace(/(\\?.)(?=[\+\*])/ig,"($1)"); 
 
    console.log("You can even take this a step further and account for a character being escaped, if that's a consideration.") 
 
    console.log("Starting with string: " + uString + "\r\n" + "Result: " + plussed); 
 
}
<input type="button" value="Run" onclick="Examp()" />

0

플래그에 대한 방법은 패턴이나 UTF8 문자를 포함하는 것으로 일치하는 문자열이 있습니까 : (난 당신이 JS를 사용하지 알고 있지만) 여기에 자바 스크립트 예제는입니까?

LC_CTYPE 환경 변수 (또는 기타 관련 로캘 설정)가 way to make regcomp/regexec understand your encoding 인 것으로 의심됩니다.

적어도 grep 프로그램이이를 고려한 것 같습니다 (https://stackoverflow.com/a/40809461/94687). 나는 이것을 regcomp 함수로 테스트하지 않았다.