정규표현식 검색과 utf8에 대한 궁금증

bootmeta의 이미지

우분투 edgy의 vi로 편집하다가 w을 이용해 다음 단어를 이동시 갑자기 특이한 점이 눈에 하나 띄더군요.
"ab한글cd"처럼 영문글자들 사이에 공백없이 한글이 들어가 있는 경우 w이용해 이동시 한단어로 취급하지 않고 한글문자 시작점과 영문문자 시작점에서 멈추게 됩니다.
이것은 vi개발자가 영리하게 다른문자셋으로 이루어진 공백없는 문자열은 한 단어로서 취급하지 않는다라는 생각으로 개발된 것인지 아니면 버그로 봐야할지 의문이 듭니다.

더 나아가 일반적으로 제공되는 awk, grep, 또는 정규표현식을 잘 지원하는 perl이나 php, python같은 언어들에서도 같은 현상이 있을까? utf8한글문자열도 정규표현식에서 제대로 처리하는 걸까?하는 생각도 들고요.

만일 있다면 이런 현상이 제가 잘모르고 있는 utf8상의 코드 구조나 정규표현식의 패턴에 이용되는 특수코드들과 cjkv들과의 충돌현상인가? 하는 의문도 듭니다.

웬지 한글파일명 파일들이나 데이타가 한글인 경우에 awk를 쓰기가 두려워지는군요.

제가 써놓고도 뭔 소리인지 두서없는 글이군요.

한글 코드에 대해 잘 아시는 분이 명쾌한 해답을 날려주시기를 기다리며..

8-)

송효진의 이미지

지금 해보니 ,: 등의 문자에서도 멈추는데 _ 에서는 안멈추네요.
그렇다는건 멈추는 규칙이 있다는거겠죠.

perl 을 기준으로 /u 옵션으로 utf8 을 정규식에 사용할 수 있습니다.
javascript 에서도 되고요.
/[가-힣]/ 이런게 되는거죠.

utf8 인식을 하게 해 놓으면 . 은 한글도 한글자 단위로 매치됩니다.
아니면 바이트 단위로 잘려서 매치되겠죠.

디자인적인 길이 맞추기는 안좋지만
php 에서 제목자르기 같은것에 정규식으로 자르도록 응용할 수도 있습니다.
$subject = preg_replace('/^(.{30}).*$/u', '\1', $subject);

emerge money

wkpark의 이미지

> "ab한글cd"처럼 영문글자들 사이에 공백없이 한글이 들어가 있는 경우 w이용해 이동시 한단어로 취급하지
> 않고 한글문자 시작점과 영문문자 시작점에서 멈추게 됩니다.
> 이것은 vi개발자가 영리하게 다른문자셋으로 이루어진 공백없는 문자열은 한 단어로서 취급하지 않는다라는
> 생각으로 개발된 것인지 아니면 버그로 봐야할지 의문이 듭니다.

그러면 띄어쓰기 하지 않는 중국어나 일어같은 경우는 어떻게 해야 할까요? 정규식은 그냥 가장 간단한 룰셋정도로 생각하시면 될 것 같군요.

Quote:

The definition of letters and digits is controlled by PCRE's character tables, and may vary if locale-specific matching is taking place.

php 설명서에 보면 word는 locale specific하다고 하였으니, 제대로 구현된 정규식으라면 로켈을 따라야 하고, 그렇다면 로켈에서 제대로 구현되어 있어야 겠군요. 모든 시스템에 대해 모두 같은 방식으로 작동할지에 대해서는 보장하지 못하겠네요. 간단히 우리가 많이 쓰는 PCRE의 문제로 좁혀서 볼 수도 있겠고..

pcre경우 property를 지원하는데 \p{Hangul}같은게 지원되나 봅니다.

> perl 을 기준으로 /u 옵션으로 utf8 을 정규식에 사용할 수 있습니다.
> javascript 에서도 되고요.
> /[가-힣]/ 이런게 되는거죠.
>
오 이런게 되는군요. 그냥 utf8같은 경우라면 무식하게 [하-힣] 같은 경우
\xED(\x95[\x98-\xBF]|[\x96-\x9D][\x80-\xBF]|\x9E[\x80-\xA3] 같은 식으로 해도 됩니다.

온갖 참된 삶은 만남이다 --Martin Buber

bootmeta의 이미지

제가 이 글을 올려놓고도 답변을 못달았군요.
제가 몰랐던 많은 것을 알려주셔서 감사합니다. :)

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.