정규식 질문 드립니다

chunj101의 이미지

안녕하세요.

정규식으로 유효성 검사를 하고 싶은데 잘 되지 않아 질문드립니다.

GRANT xxxx; REVOKE xxxx; ALTER TABLE xxxx; ALTER USER xxxx; DROP USER xxxx; GRANT xxxx;

입력값은 위와 같은 형식으로 받을수 있구요. 구분자는 세미콜론(;) 입니다.
위 입력에서 GRANT, REVOKE, ALTER USER, DROP USER만 허용 가능한 패턴이고 ALTER TABLE 같이 허용 가능 외 패턴이 입력되는 것을 필터링 하고 싶습니다.

입력에 따라 xxx ; 처럼 세미콜론 이전에 공백이 추가될수도 있고 xxx; REVOKE 처럼 세미콜론 이후 공백이 2개 이상일 수도 있습니다.

GRANT ~; REVOKE ~; ALTER USER ~; DROP USER ~; 이렇게 제가 정한 허용 가능한 규칙을 입력 받은 값에서 구분자 구분에 따라 처음부터 마지막까지 유효성 검사를 하고 싶습니다.

제가 했을때는 GRANT ~ 마지막 세미콜론 까지 선택되어 구분자마다 패턴 분석을 하지 못해서 질문 드리게 되었습니다.

익명 사용자의 이미지

구분자가 ; 세미콜론이면 다음과 같이 해보세요
(ALTER TABLE 이후 처음 ; 세미콜론이 나올때까지 매칭)

ALTER TABLE[^;]+;

chunj101의 이미지

위 구문은 예시로 적은건데 오해의 소지가 있었던것 같네요 ^^;;
입력값이 정해져 있지 않구요. 허용된 구문은 GRANT, REVOKE, DROP USER, ALTER USER 이고 예를들어 ALTER TABLE 같은 그 외의 모든 구문은 유효성 검사 실패를 해야 해서요.
ALTER TABLE이 DROP DATABASE가 될수도 있고 입력받는대로 판별해야 합니다.

익명 사용자의 이미지

제시된 상황에서는 그냥 "ALTER TABLE" 검색하면 되는 것 아닌가요?

chunj101의 이미지

네..위에 대댓글로 적은것 처럼 ALTER TABLE은 예시일 뿐이라서요. 허용된 형식만 고정입니다.

익명 사용자의 이미지

$ cat input.txt
GRANT xxxx; REVOKE xxxx; ALTER TABLE xxxx; ALTER USER xxxx; DROP USER xxxx; GRANT xxxx;
GRANT xxxx; REVOKE xxxx; ALTER USER xxxx; DROP USER xxxx; GRANT xxxx;
GRANT xxxx;  REVOKE xxxx ;   GRANT   xxxx; DROP USER xxxx; GRANT xxxx;
 
$ cat pat.txt
GRANT
REVOKE
ALTER USER
DROP USER
 
$ cat input.txt | tr -s ';' '\n' |  awk 'NF{NF--};1' | sort -u | grep -Fvf pat.txt | grep -v '^\s*$' | grep -Fwf - input.txt
GRANT xxxx; REVOKE xxxx; ALTER TABLE xxxx; ALTER USER xxxx; DROP USER xxxx; GRANT xxxx;
chunj101의 이미지

답변 감사합니다.

bushi의 이미지

> 마지막 세미콜론 까지 선택

greedy match 가 기본이라서 그렇습니다. non-greedy match 로 지정하시면 됩니다.
첫번째 익명님이 다신 댓글은,
regex 와 비슷하긴 하지만 non-greedy 지시자(지정자?)가 딱히 없는 sed 등에서도 사용할 수 있는 non-greedy 패턴입니다.
손가락을 보시지 말고 손가락이 뭘 가르키고 있는지 보세요...

$ x="GRANT xxxx; REVOKE xxxx; ALTER TABLE xxxx; ALTER USER xxxx; DROP USER xxxx; GRANT xxxx;"
 
$ echo $x | sed "s@GRANT \(.*\);@@g"       
 
$ echo $x | sed "s@GRANT \([^;]*\);@@g"
 REVOKE xxxx; ALTER TABLE xxxx; ALTER USER xxxx; DROP USER xxxx;
 
$ echo $x | perl -pe "s@GRANT (.*);@@g"
 
$ echo $x | perl -pe "s@GRANT (.*?);@@g"
 REVOKE xxxx; ALTER TABLE xxxx; ALTER USER xxxx; DROP USER xxxx;
chunj101의 이미지

답변 감사합니다.

댓글 달기

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