정규식 만들기 질문입니다.

sisuc의 이미지

먼저 제가 구하고 싶은 것은 mysql상에 있는 레코드중에

"/아이디 또는 이메일 형식[폴더명형식]"

위의 같은 순서로 되어있는 문자열이 있는 행만 추출하고 싶습니다.

매칭 예:
te-s.t@test.com[test]
test[test]

중요한것은 앞의 값이 '아이디' 또는 '이메일 형식'이고

그 다음에는 '[' 와 ']'로 감싸져있는 값을 구하면 됩니다.

정규식을 잘아시는분들 도움 기다리겠습니다.

(정규식 매뉴얼을 보고 공부를 하면 되겠지만
혼자 처리하기에 조금 불안해서 여기에 질문을 올려봅니다..)

eseo의 이미지

행 추출은 아래와 같이 하면 되지 않을까요?

grep "\[.*\]"  _input_file_

---
배려하는 마음을 갖자.

sisuc의 이미지

아..질문이 부족했군요

mysql 쿼리를 만들어야 합니다..ㅠㅠ

그리고 반드시 처음에 와야 합니다.

중간에 저런 식으로 들어가도 찾으면 안됩니다..

위대한 한글

eseo의 이미지

sql은 모르겠구요,
아이디 또는 이메일이 알파벳으로 시작한다면 아래와 같이 할수 있겠네요.

^[a-zA-Z].*\[.*\]

---
배려하는 마음을 갖자.

sisuc의 이미지

답변 감사드립니다.
맨 아래 댓글 달아놓은 내용으로 테스트를 해보면

알려주신 정규식에 ^를 빼면
예문의 거의 전부가 매칭이 됩니다.

^가있으면 동작하지 않구요..ㅠㅠ

위대한 한글

shinsuk의 이미지

/^[a-zA-Z-\.]\+\(@[a-zA-Z-\.]\+\)\?\[[a-zA-Z-\.]\+\]$

이 정도?

sisuc의 이미지

이곳에서 테스트 해보니 되지않네요..
http://www.rubular.com/

위대한 한글

shinsuk의 이미지

루비에서라면, 이걸로 해보세요.

^([a-zA-Z-\.]+)(@[a-zA-Z-\.]+)?\[([a-zA-Z-\.]+)\]$

sisuc의 이미지

테스트 사이트가 저기 밖에 몰라서 그냥 저곳에서 하는 것인데 딱히 루비용은 아닙니다..ㅠㅠ

위대한 한글

shint의 이미지

([a-zA-Z-\.]+)

http://cafe.naver.com/typoonweb/160

^([a-z\d\.-]{2,40})\@([a-z\d\.-]{2,16})([a-z\d\.-\[\]]{2,40})

([a-zA-Z-\.]) 조건에 포함되는 문자를 하나씩 끝까지 찾는다.
([a-zA-Z-\.]+) 조건에 포함되는 문자를 하나씩 끝까지 찾는데. 그룹으로 나누어 묶는다.
Match 1
1. te-s.t
Match 2
1. test.com
Match 3
1. test

(@[a-zA-Z-\.]+) @를 넣고 싶으면
@test.com
@([a-zA-Z-\.]+) @를 빼고 싶으면
test.com

\[([a-zA-Z-\.]+)\] []를 빼고 싶으면
(\[[a-zA-Z-\.]+\]) []를 넣고 싶으면

(?[a-zA-Z-\.]+) 이름을 주고 싶으면 ?
(?[a-zA-Z-\.]+)
(?@[a-zA-Z-\.]+)
(?\[[a-zA-Z-\.]+\])

group1 te-s.t
group2 @test.com
group3 [test]

(?\d{1,2})\/(?\d{1,2})\/(?\d{4})
Today's date is: 6/23/2014.
month 6
day 23
year 2014

----------------------------------------------------------------------------
젊음'은 모든것을 가능하게 만든다.

매일 1억명이 사용하는 프로그램을 함께 만들어보고 싶습니다.
정규 근로 시간을 지키는. 야근 없는 회사와 거래합니다.

각 분야별. 좋은 책'이나 사이트' 블로그' 링크 소개 받습니다. shintx@naver.com

sisuc의 이미지

친절한 답변 감사드립니다.
하나하나 따라해보았는제 중간부분에서 막히네요..
애초에 질문 전달을 잘못한것같아서 아래 댓글 달아놓았습니다.
시간이 되시면 한번 봐주시면 감사하겠습니다.

위대한 한글

sisuc의 이미지

여러분들 답변 감사드립니다.

정말 감사드리는데 제가 원하는 정규식은 없네요..ㅠㅠ

본문에도 있듯이 mysql 쿼리로 사용할 정규식이고
테스트는 아래 새로운 사이트를 발견하여

알려주신 정규식으로 테스트 해보고 있습니다만

하나도 동작하지 않습니다.

http://www.regexr.com/

제가 테스트 하는 문자들은 아래와 같습니다.

/test[test]
/t.es-t_1234@test.com[test]/test/test
/test[test]/test[test]/test[test]
------------------------------------------------
/test/test[test]
/[test]/test/[test]
/test/test[test]
/[test]/test

위의 예에서
첫번째것과 두번째것과 세번째것이 매칭되면 됩니다..
중요한것은 '아이디[내용]' 이 처음 한번만 매칭되면
그 뒤에는 뭐가 오든 신경안써도 된다는것입니다.
하지만 위의 조건이 중간에 오거나 뒤에오면 안되는것이죠..

참고로 현재 사용하는 정규식은 아래와 같습니다.
'^/[a-z0-9\\\\-\\\\_\\\\.\\\\@].*\\\\['

이 정규식은 '아이디[이름]'의 조건이 아무곳에 있어도 매칭이되버리는 문제가 있습니다.

위대한 한글

김정균의 이미지

mysql> SELECT * FROM test WHERE name REGEXP '[^\\[/]+\\[[^\\]]+\\]';

정도로 해 보시죠. mysql은 escape을 중첩해야 하네요. 일단 제시하신 조건은 맞는데, [] 앞의 문자열이 어떻게 되느냐에 따라서 수정이 필요할 수있습니다. 제가 알려드린 rule은 [ 문자 앞에 "["와 "/" 이 아닌 문자가 있을 경우 입니다.

sisuc의 이미지

음...아...

어떤 의미인지..내공이 부족해서 모르겠네요

일단 그대로 select해보았지만 0건이네요..

[]앞의 문자열은 어느부분을 가르키는 것인지..
제일처음의 [와 맨 끝의] 인가요?

위대한 한글

김정균의 이미지

MariaDB [(none)]> SELECT '/test/test[test]' REGEXP '[^\\[/]+\\[[^\\]]+\\]';
+---------------------------------------------------+
| '/test/test[test]' REGEXP '[^\\[/]+\\[[^\\]]+\\]' |
+---------------------------------------------------+
|                                                 1 |
+---------------------------------------------------+
1 row in set (0.00 sec)
 
MariaDB [(none)]> 

위와 같이 질의 했을 때 결과과 동일한지 알려 주세요. 동일하게 1이 나온다면, 아마도 저장된 데이터가 제시하신 데이터와 다른 조건이 있을 것 같은데요.

sisuc의 이미지

0이 나오네요.

mysql> SELECT '/test/test[test]' REGEXP '[^\\[/]+\\[[^\\]]+\\]';
+---------------------------------------------------+
| '/test/test[test]' REGEXP '[^\\[/]+\\[[^\\]]+\\]' |
+---------------------------------------------------+
| 0 |
+---------------------------------------------------+
1 row in set (0.00 sec)

위의 조건은 매칭이 안되는게 맞습니다.

하지만 /test[test]로 셀렉트 해도 0이 나오네요..

아래는 실제 데이터들 입니다.

| /demo/TEST0320/ |
| /demo/TEST0320/ |
| /demo/LogMailTest/ |
| /demo/LogMailTest/demo[test]subject/
| /demo/LogMailTest/[dede[dede/ |
| /demo/TEST/LogMailTest/demo[test]subject/ |
| /demo/TEST/LogMailTest/[dede[dede/ |
| /demo/TEST/TESTLINK/ |
| /demo/TEST/LogMailTest/[test[test]]/ |
| /demo/TEST/LogMailTest/[test]test/ |
| /demo/TEST/LogMailTest/test[/ |
| /demo/TEST/LogMailTest/test[test/ |
| /demo/TEST/LogMailTest/test]/ |
| /demo/TEST/LogMailTest/test]test/ |
| /demo/Picture/01/
-------------------------------------------------------------------------------
| /demo[qwer]/ |
| /demo[demo]/test/test/ |
| /demo[demo]/test/test/test[test]/
| /demo[abcd]/

위이에 --- 아래 부분의 값만 추출하면 되는데..
다만 demo가 이메일형식이 될수도있다는 조건이 포함됩니다만..

위대한 한글

김정균의 이미지

ㅎㅎ mysql과 mariadb의 regexp compiler가 틀린가 보군요. --; (이 정규식은 이메일 패턴이 있든 없든 상관 없습니다. "[" 문자 앖에 "/" 만 없으면 되는 정규식이니가요)

mysql> SELECT '/test/test[test]' REGEXP '[^[.left-square-bracket.]/]+\\[[^[.right-square-bracket.]]+\\]';
+--------------------------------------------------------------------------------------------+
| '/test/test[test]' REGEXP '[^[.left-square-bracket.]/]+\\[[^[.right-square-bracket.]]+\\]' |
+--------------------------------------------------------------------------------------------+
|                                                                                          1 |
+--------------------------------------------------------------------------------------------+

일단 위의 정규식은 mariadb 5.5와 mysql 5.5, mysql 5.6에서는 적용이 됩니다. mariadb 10에서는 compile error가 발생하네요.

mariadb 10에서는

MariaDB [(none)]> SELECT '/test/test[test]' REGEXP '[^\\[/]+\\[[^\\]]+\\]';
+---------------------------------------------------+
| '/test/test[test]' REGEXP '[^\\[/]+\\[[^\\]]+\\]' |
+---------------------------------------------------+
|                                                 1 |
+---------------------------------------------------+

와 같이 해야 합니다. maria 5.5에서도 안됩니다. mariadb 10의 regex compiler가 mysql과 결별한 모양입니다.

그리고, 올려주신 실제 데이터 보니, test[test[test]] 같은 것도 있는데, 문자[문자] 만 match가 되는 룰이니, 참고 하셔서 수정해서 사용하시면 될 것 같습니다.

그리고, DB를 타지 않으시려면, 정규식 매치를 DB에서 하기 보다는 application에서 하시는 것이 더 좋을 듯 싶군요. 이렇게 버전 타기 시작하면 나중에 application 관리하는 것이 좋지 않습니다.

sisuc의 이미지

아.. 친절한 답변 감사드립니다.
/test/test[test] 이거는 매치가 되면 안되는데..
마지막으로 /test/test[test] 이런 형식은 매치가안되게 해주실 수 없나요?

'/아이디[이름]/이 뒤에는 뭐가 오든 상관없음'

위와 같은 형식이 아니면 매치가 안되야하거든요..

제가 고쳐서 사용하려니 공부를 해야 하는데 그렇다면 애초에 질문을 올리지도 않았을텐데 ㅜㅜ

위대한 한글

김정균의 이미지

공부를 하시라고 도와드리는 건데, 공부를 안하시겠다고 하면 굳이 제가 해 드릴 이유는 없을 것 같습니다. 일단 제가 만들어 드린 rule이 거의 90%는 만들어진 것이고, 제가 여기까지 해 드린 것도 mysql version별로 정규식이 다른가 싶어 확인해 본 차원입니다.

제가 만들어 드린 룰에서 기본 뼈대는 만들어진 상태이기 때문에, 문서를 보시고 정규식에 대한 이해를 조금만 하신다면 원하시는 바를 해결하는데 많은 시간이 들지는 않을 것으로 판단 됩니다.

그리고, 이 DB를 계속 사용하시는 것이라면, db에서 정규식으로 체크하시지 말고 application에서 분류를 하시는 것을 권장 합니다. DB의 경우 버전마다 다른 정규식을 적용해야 한다면 나중에 유지보수 비용이 엄청나게 커질 겁니다. appliaction에서 하면 속도가 늦어질 것이라고 판단하시는 것 같은데, 하시려고 하는 것은 크게 차이나지 않을 것으로 보입니다. (shell로 grep하는 것이 아니라면 말이죠..)

sisuc의 이미지

네 알겠습니다. 지금까지의 답변도 충분히 감사드립니다.
공부하라고 일부러 미완성으로 답변해주신 점도 어느정도 알고있었습니다만...
공부를 해야겠네요.

(결국 질문의 원점으로 돌아가는 느낌이지만...ㅠㅠ
왜냐면 현재 사용하고 있는 정규식의 문제가
알려주신 정규식과 비슷하기 때문입니다.)

조언해주신부분은.. 맞는 말씀이라고 생각됩니다.
하지만 지금 해결하려는 것은 상당히 오래된 어플리케이션의 유지보수입니다.

그 덕에 지금 이 문제를 해결하려고 시간을 허비하고있는 부분입니다.
(예를들어 참 거짓을 판단하기 위해서는 DB상에 0또는 1로 값을 넣어 놓으면 되는데
오래된 어플이다 보니 그런부분이 취약하여 다른 값으로 판단(정규식을 이용한)할 수 밖에 없을 정도의 어플입니다...-_-)

만약 새로운 어플리케이션을 개발할 일이 있으면 말씀해주신 조언을 참고하겠습니다.

신경써주셔서 감사드립니다.

위대한 한글

김정균의 이미지

공부를 하신다고 하니.. 거의 다 해 놓은 것이라 일단 더 만들어 보자면, 일단 조건을 제대로 이해했다면

REGEXP '^/[^[.left-square-bracket.]/]+\\[[^[.right-square-bracket.]]+\\]/?';

로 하시면 원하시는 바가 되지 않을까 싶기는 하네요.

sisuc의 이미지

아.. 지금 봤네요 답변이 늦어져서 죄송합니다.
저도 나름대로 공부해서 만들어본게 있는데
혹시 시간이 되신다면 잘못된 점이 있나 봐주세요.

제가 만든 식은 ^\\/[^\\/]+\\[.*\\] 으로
테스트 결과는 아래와 같습니다.

(만들어서 테스트 해본 결과 원하는대로 결과는 나오지만
[^\\/]+ 이 부분의 의미는 완전히 이해가 안되네요 ㅎㅎ;)

mysql> select '/demo[demo]/test/test/' REGEXP '^\\/[^\\/]+\\[.*\\]';
+-------------------------------------------------------+
| '/demo[demo]/test/test/' REGEXP '^\\/[^\\/]+\\[.*\\]' |
+-------------------------------------------------------+
| 1 |
+-------------------------------------------------------+
1 row in set (0.00 sec)

mysql> select '/demo/demo[demo]/test/test/' REGEXP '^\\/[^\\/]+\\[.*\\]';
+------------------------------------------------------------+
| '/demo/demo[demo]/test/test/' REGEXP '^\\/[^\\/]+\\[.*\\]' |
+------------------------------------------------------------+
| 0 |
+------------------------------------------------------------+
1 row in set (0.00 sec)

알려주신것도 테스트 해보겠습니다.
감사합니다.

-추가-
테스트 해보니 알려주신것도 잘 됩니다.
어느것이 더 좋은지 모르겠네요
기분상으로는 알려주신것을 쓰고싶은데
이해를 못해서 나중을 생각하면 불안한것도 있네요 ;

(/는 escape처리 안해줘도 되나보네요..?)

위대한 한글

김정균의 이미지

직접 만드신 룰은 예외 처리가 안되어 있죠. 예를들어..

mysql> select '/demo[demo[demo]]/test/test/' REGEXP '^\\/[^/]+\\[.*\\]';
+-----------------------------------------------------------+
| '/demo[demo[demo]]/test/test/' REGEXP '^\\/[^/]+\\[.*\\]' |
+-----------------------------------------------------------+
|                                                         1 |
+-----------------------------------------------------------+

위와 같은 것도 true가 되죠.

http://dev.mysql.com/doc/refman/5.1/en/regexp.html 를 잘 보시면 제 룰이 이해가 되실 겁니다. mysql 특성 때문에 mysql에만 적용되는 정규식이 들어가 있어 좀 난해해 보이기는 하지만 크게 틀린 것은 없습니다.

[.left-square-bracket.] 은 '[' 문자를 의미합니다. mysql에만 적용될 겁니다.

sisuc의 이미지

답장이 늦었네요.
끝까지 신경써주셔서 정말 감사드립니다.
제꺼는 다른 케이스를 생각안하고 만들었네요.
역시 알려주신걸로 해야 할 듯하네요..
부족한 부분은 공부를 더 해야 겠습니다.
감사합니다^^

위대한 한글

phonon의 이미지

sisuc의 이미지

네 답변 감사드립니다.

위대한 한글

glay의 이미지

질문이 좀 답답한 감이 있네요

정확히 무엇을 하기 위한 정규식이죠?

꼭 mysql 상에서 쿼리로 뽑아야 하는 것인가요?

row 단위로 dump 를 받아서 해당값만 뽑아도 되지 않나요? "mysqldump --extended-insert=false -u user -p DBname TableName > DBname_TableName.sql"

정확히 할려고 하는 작업이 뭔지 알려주시면 확실한 답이 나오지 싶습니다.

간단하게는 row 단위로 덤프를 받아서 해당 덤프 파일을 sed 나 기타 정규식으로 test@test.com[test] 형식으로 뽑던 test[test] 로 뽑던

한번 거르던 두번 거르던 걸러진 값을 가지고 다시 insert 문을 만들어서 가공을 하시던 하면 될 것 같습니다만 ? (삶아 먹던 국 끓여 먹던)

아닌가요?


--------------- 절취선 ------------------------
하늘은 스스로 삽질하는 자를 삽으로 팬다.

http://glay.pe.kr

sisuc의 이미지

음 DB상에서 직접 값을 추출해야 합니다.
덤프는 사용하지 않습니다.

php로 mysql값을 셀렉트하는 단순한 작업입니다.
다만 조건을 걸어서 특정 조건(정규식)에 맞는 레코드만 셀렉트 하고 싶은것입니다.

가공을 하면 처리가 느려지기 때문에 그렇게 할 수도 없고 할 필요도 없을 것 같습니다.
값이 있으니 그 값을 조건에 맞게만 가져오면 되거든요..

음 설명이 부족할지 모르지만
폴더인지 사용자인지 구별을 해야 합니다.

값이 아래와 같으면 사용자입니다.
/demo[demo]/
/demo[abcd]/demo/[demo]/

값이 아래와 같으면 폴더입니다.
/demo/demo[abcd]/
/demo/[demo]demo/

위대한 한글

댓글 달기

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
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.