рдкреЗрд╢реЗрд╡рд░ рдирд┐рдпрдорд┐рдд рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рд╢рд╛рдмреНрджрд┐рдХ рд╡рд┐рд╢реНрд▓реЗрд╖рдг

рдкрд╛рда рдкрд╛рд░реНрд╕рд┐рдВрдЧ рд╣рдореЗрд╢рд╛ рд╢рд╛рдмреНрджрд┐рдХ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдпрд╛ рдЯреЛрдХрди рдХреЗ рд╕рд╛рде рд╢реБрд░реВ рд╣реЛрддрд╛ рд╣реИред рдирд┐рдпрдорд┐рдд рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд▓рдЧрднрдЧ рдХрд┐рд╕реА рднреА рднрд╛рд╖рд╛ рдХреЗ рд▓рд┐рдП рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдХрд╛ рдПрдХ рдЖрд╕рд╛рди рддрд░реАрдХрд╛ рд╣реИред рдЕрдЪреНрдЫрд╛ рдкреБрд░рд╛рдиреЗ regexp рдХрд╛ рдПрдХ рдФрд░ рдЙрдкрдпреЛрдЧред


рдореИрдВ рдЕрдХреНрд╕рд░ рдкрд╛рда рдХреЛ рдкрд╛рд░реНрд╕ рдХрд░рдиреЗ рдХреЗ рдХрд╛рд░реНрдп рдХрд╛ рд╕рд╛рдордирд╛ рдХрд░рддрд╛ рд╣реВрдВред рд╕рд░рд▓ рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП, рдЬреИрд╕реЗ рдХрд┐ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рджреНрд╡рд╛рд░рд╛ рджрд░реНрдЬ рдореВрд▓реНрдп рдХрд╛ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХрд░рдирд╛, рдмреБрдирд┐рдпрд╛рджреА рдирд┐рдпрдорд┐рдд рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдХреА рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдкрд░реНрдпрд╛рдкреНрдд рд╣реИред рдХрдВрдкрд╛рдЗрд▓рд░ рдпрд╛ рд╕реНрдЯреИрдЯрд┐рдХ рдХреЛрдб рдПрдирд╛рд▓рд┐рд╕рд┐рд╕ рд▓рд┐рдЦрдиреЗ рдЬреИрд╕реЗ рдЬрдЯрд┐рд▓ рдФрд░ рднрд╛рд░реА рдХрд╛рдореЛрдВ рдХреЗ рд▓рд┐рдП, рдЖрдк рд╡рд┐рд╢реЗрд╖ рдЯреВрд▓ (AntLR, JavaCC, Yacc) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рд▓реЗрдХрд┐рди рдореИрдВ рдЕрдХреНрд╕рд░ рдПрдХ рдордзреНрдпрд╡рд░реНрддреА рд╕реНрддрд░ рдХреЗ рдХрд╛рд░реНрдпреЛрдВ рдореЗрдВ рдЖрддрд╛ рд╣реВрдВ, рдЬрдм рдкрд░реНрдпрд╛рдкреНрдд рдирд┐рдпрдорд┐рдд рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдирд╣реАрдВ рд╣реЛрддреА рд╣реИ, рд▓реЗрдХрд┐рди рдореБрдЭреЗ рдЗрд╕ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдореЗрдВ рднрд╛рд░реА рдЙрдкрдХрд░рдг рдЦреАрдВрдЪрдиреЗ рдХрд╛ рдорди рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдпреЗ рдЙрдкрдХрд░рдг рдЖрдорддреМрд░ рдкрд░ рд╕рдВрдХрд▓рди-рд╕рдордп рдХреЗ рдЪрд░рдг рдореЗрдВ рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рд░рди-рдЯрд╛рдЗрдо рдореЗрдВ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдкреИрд░рд╛рдореАрдЯрд░ рдмрджрд▓рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рдирд╣реАрдВ рджреЗрддреЗ рд╣реИрдВ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдХрд┐рд╕реА рдлрд╝рд╛рдЗрд▓ рдпрд╛ рдбреЗрдЯрд╛рдмреЗрд╕ рддрд╛рд▓рд┐рдХрд╛ рд╕реЗ рдХреАрд╡рд░реНрдб рдХреА рд╕реВрдЪреА рдмрдирд╛рдирд╛)ред


рдПрдХ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд░реВрдк рдореЗрдВ, рдореИрдВ рдПрдХ рдХрд╛рд░реНрдп рджреЗрддрд╛ рд╣реВрдВ рдЬреЛ SQL рдкреНрд░рд╢реНрдиреЛрдВ рдХреЛ рддреЗрдЬ рдХрд░рдиреЗ рдХреА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЗ рджреМрд░рд╛рди рдЙрддреНрдкрдиреНрди рд╣реБрдЖред рд╣рдордиреЗ рдЕрдкрдиреЗ рдПрд╕рдХреНрдпреВрдПрд▓ рдкреНрд░рд╢реНрдиреЛрдВ рдХреЗ рд▓реЙрдЧ рдХрд╛ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХрд┐рдпрд╛ рдФрд░ рдХреБрдЫ рдирд┐рдпрдореЛрдВ рдХреЗ рдЕрдиреБрд╕рд╛рд░ "рдЦрд░рд╛рдм" рдкреНрд░рд╢реНрдиреЛрдВ рдХреЛ рдвреВрдВрдврдирд╛ рдЪрд╛рд╣рддреЗ рдереЗред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдХреНрд╡реЗрд░реАрдЬрд╝ рдЬрд┐рд╕рдореЗрдВ OR рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдорд╛рдиреЛрдВ рдХреЗ рдПрдХ рд╕реЗрдЯ рдХреЗ рд▓рд┐рдП рдЙрд╕реА рдлрд╝реАрд▓реНрдб рдХреА рдЬрд╛рдБрдЪ рдХреА рдЬрд╛рддреА рд╣реИ


name = 'John' OR name = 'Michael' OR name = 'Bob' 

рд╣рдо рдРрд╕реЗ рдЕрдиреБрд░реЛрдзреЛрдВ рдХреЛ рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рдереЗ


 name IN ('John', 'Michael', 'Bob') 

рдирд┐рдпрдорд┐рдд рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐рдпрд╛рдБ рдЕрдм рд╕рд╛рдордирд╛ рдирд╣реАрдВ рдХрд░ рд╕рдХрддреА рд╣реИрдВ, рд▓реЗрдХрд┐рди рдореИрдВ AntLR рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдПрдХ рдкреВрд░реНрдг SQL рдкрд╛рд░реНрд╕рд░ рдмрдирд╛рдирд╛ рдирд╣реАрдВ рдЪрд╛рд╣рддрд╛ рдерд╛ред рдмрд┐рдирд╛ рдХрд┐рд╕реА рд╡рд┐рд╢реЗрд╖ рдЯреВрд▓ рдХреЗ рдкрд╛рд░реНрд╕рд┐рдВрдЧ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдиреБрд░реЛрдз рдкрд╛рда рдХреЛ рдЯреЛрдХрди рдореЗрдВ рддреЛрдбрд╝рдирд╛ рдФрд░ рд╕рд░рд▓ рдХреЛрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╕рдВрднрд╡ рд╣реЛрдЧрд╛ред


рдирд┐рдпрдорд┐рдд рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдХреА рдмреБрдирд┐рдпрд╛рджреА рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рдХреЛ рд╣рд▓ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдЖрдЗрдП SQL рдХреНрд╡реЗрд░реА рдХреЛ рдЯреЛрдХрди рдореЗрдВ рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░реЗрдВред рд╣рдо рдПрд╕рдХреНрдпреВрдПрд▓ рдХреЗ рд╕рд░рд▓реАрдХреГрдд рд╕рдВрд╕реНрдХрд░рдг рдХреЛ рджреЗрдЦреЗрдВрдЧреЗ рддрд╛рдХрд┐ рд╡рд┐рд╡рд░рдг рдХреЗ рд╕рд╛рде рдкрд╛рда рдХреЛ рдЕрдзрд┐рднрд╛рд░ рди рдбрд╛рд▓реЗрдВред рдкреВрд░реНрдг-рд╕реНрддрд░реАрдп SQL lexer рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдереЛрдбрд╝реЗ рдЕрдзрд┐рдХ рдЬрдЯрд┐рд▓ рдирд┐рдпрдорд┐рдд рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рд▓рд┐рдЦрдиреЗ рд╣реЛрдВрдЧреЗред


рдпрд╣рд╛рдБ рдореВрд▓ SQL рднрд╛рд╖рд╛ рдЯреЛрдХрди рдХреЗ рд▓рд┐рдП рднрд╛рд╡реЛрдВ рдХрд╛ рдПрдХ рд╕рдореВрд╣ рд╣реИ:


 1. keyword : \b(?:select|from|where|group|by|order|or|and|not|exists|having|join|left|right|inner)\b 2. id : [A-Za-z][A-Za-z0-9]* 3. real_number : [0-9]+\.[0-9]* 4. number : [0-9]+ 5. string : '[^']*' 6. space : \s+ 7. comment : \-\-[^\n\r]* 8. operation : [+\-\*/.=\(\)] 

рдореИрдВ рдХреАрд╡рд░реНрдб рдХреЗ рд▓рд┐рдП рдирд┐рдпрдорд┐рдд рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдкрд░ рдзреНрдпрд╛рди рджреЗрдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ


 keyword : \b(?:select|from|where|group|by|order|or|and|not|exists|having|join|left|right|inner)\b 

рдЗрд╕рдХреА рджреЛ рд╡рд┐рд╢реЗрд╖рддрд╛рдПрдВ рд╣реИрдВред


  1. рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЕрдВрдд рдореЗрдВ рдФрд░ рдЕрдВрдд рдореЗрдВ \ b рдСрдкрд░реЗрдЯрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддрд╛рдХрд┐ рд╢рдмреНрдж рд╕рдВрдЧрдарди рд╕реЗ рдпрд╛ рдЙрдкрд╕рд░реНрдЧ рдХреЛ рдХрд╛рдЯ рди рд╕рдХреЗрдВ, рдЬреЛ рдПрдХ рдХреАрд╡рд░реНрдб рд╣реИ рдФрд░ рдЬреЛ рдХреБрдЫ regex рдЗрдВрдЬрди \ b рдСрдкрд░реЗрдЯрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдмрд┐рдирд╛ рдПрдХ рдЕрд▓рдЧ рдЯреЛрдХрди рдореЗрдВ рдЕрд▓рдЧ рд╣реЛ рдЬрд╛рдПрдЧрд╛ред
  2. рд╕рднреА рд╢рдмреНрджреЛрдВ рдХреЛ рдЧреИрд░-рдХреИрдкреНрдЪрд░рд┐рдВрдЧ рдмреНрд░реИрдХреЗрдЯ рджреНрд╡рд╛рд░рд╛ рд╡рд░реНрдЧреАрдХреГрдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ (! :) рдЬреЛ рдореИрдЪ рдкрд░ рдХрдмреНрдЬрд╛ рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВред рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рднрд╡рд┐рд╖реНрдп рдореЗрдВ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ рддрд╛рдХрд┐ рд╕рд╛рдорд╛рдиреНрдп рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдХреЗ рднреАрддрд░ рдЖрдВрд╢рд┐рдХ рдирд┐рдпрдорд┐рдд рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐рдпреЛрдВ рдХреЗ рдЕрдиреБрдХреНрд░рдордг рдХрд╛ рдЙрд▓реНрд▓рдВрдШрди рди рд╣реЛред

рдЕрдм рдЖрдк рдЧреНрд░реБрдкрд┐рдВрдЧ рдФрд░ рдСрдкрд░реЗрдЯрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЗрди рд╕рднреА рднрд╛рд╡реЛрдВ рдХреЛ рдПрдХ рд╣реА рдореЗрдВ рдЬреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВ |


 (\b(?:select|from|where|group|by|order|or|and|not|exists|having|join|left|right|inner)\b)|([A-Za-z][A-Za-z0-9]*)|([0-9]+\.[0-9]*)|([0-9]+)|('[^']*')|(\s+)|(\-\-[^\n\r]*)|([+\-\*/.=\(\)]) 

рдЕрдм рдЖрдк рдЗрд╕ рдПрдХреНрд╕рдкреНрд░реЗрд╢рди рдХреЛ SQL рдПрдХреНрд╕рдкреНрд░реЗрд╢рди рдореЗрдВ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП


 SELECT count(id) -- count of 'Johns' FROM person WHERE name = 'John' 

рдпрд╣рд╛рдБ рд░реЗрдЧреЗрдХреНрд╕ рдкрд░реАрдХреНрд╖рдХ рдкрд░ рдкрд░рд┐рдгрд╛рдо рд╣реИ ред рд▓рд┐рдВрдХ рдкрд░ рдХреНрд▓рд┐рдХ рдХрд░рдХреЗ рдЖрдк рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдФрд░ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХреЗ рдкрд░рд┐рдгрд╛рдо рдХреЗ рд╕рд╛рде рдЦреЗрд▓ рд╕рдХрддреЗ рд╣реИрдВред рдпрд╣ рджреЗрдЦрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, SELECT рддреБрд░рдВрдд 1-рд╕рдореВрд╣ рд╕реЗ рдореЗрд▓ рдЦрд╛рддрд╛ рд╣реИ, рдЬреЛ рдХреАрд╡рд░реНрдб рдкреНрд░рдХрд╛рд░ рд╕реЗ рдореЗрд▓ рдЦрд╛рддрд╛ рд╣реИред


рдЫрд╡рд┐


рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдЕрдиреБрд░реЛрдз рдХрд╛ рдкреВрд░рд╛ рдкрд╛рда рд╕рдмрд╕реНрдЯреНрд░рд┐рдВрдЧ рдореЗрдВ рд╡рд┐рднрд╛рдЬрд┐рдд рд╣реЛ рдЧрдпрд╛ рд╣реИ рдФрд░ рдкреНрд░рддреНрдпреЗрдХ рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рд╕рдореВрд╣ рд╕реЗ рдореЗрд▓ рдЦрд╛рддрд╛ рд╣реИред рд╕рдореВрд╣ рд╕рдВрдЦреНрдпрд╛ рдХреЗ рдЕрдиреБрд╕рд╛рд░, рдЖрдк рдЗрд╕реЗ рдЯреЛрдХрди (рдЯреЛрдХрди) рдХреЗ рдкреНрд░рдХрд╛рд░ рдХреЗ рд╕рд╛рде рд╕рд╣рд╕рдВрдмрджреНрдз рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред


рджрд┐рдП рдЧрдП рдПрд▓реНрдЧреЛрд░рд┐рджрдо рдХреЛ рдХрд┐рд╕реА рднреА рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рднрд╛рд╖рд╛ рдореЗрдВ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдореЗрдВ рдмрдирд╛рдирд╛ рдЬреЛ рдирд┐рдпрдорд┐рдд рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рддрд╛ рд╣реИ, рдореБрд╢реНрдХрд┐рд▓ рдирд╣реАрдВ рд╣реИред рдпрд╣рд╛рдВ рдПрдХ рдЫреЛрдЯрд╛ рд╡рд░реНрдЧ рд╣реИ рдЬреЛ рдЬрд╛рд╡рд╛ рдореЗрдВ рдЗрд╕реЗ рд▓рд╛рдЧреВ рдХрд░рддрд╛ рд╣реИред


RegexTokenizer.java (+ рдХреБрдЫ рдФрд░ рд╡рд░реНрдЧ)
 package org.example; import java.util.ArrayList; import java.util.Enumeration; import java.util.List; import java.util.regex.Matcher; import java.util.regex.Pattern; import java.util.stream.Collectors; /** *    . *   ,         . */ public class RegexTokenizer implements Enumeration<Token> { // ,      private final String content; //         private final ITokenType[] tokenTypes; private final Matcher matcher; //    private int currentPosition = 0; /** * @param content    * @param tokenTypes         */ public RegexTokenizer(String content, ITokenType[] tokenTypes) { this.content = content; this.tokenTypes = tokenTypes; //       List<String> regexList = new ArrayList<>(); for (int i = 0; i < tokenTypes.length; i++) { ITokenType tokenType = tokenTypes[i]; regexList.add("(?<g" + i + ">" + tokenType.getRegex() + ")"); } String regex = regexList.stream().collect(Collectors.joining("|")); Pattern pattern = Pattern.compile(regex, Pattern.CASE_INSENSITIVE); //    matcher = pattern.matcher(content); matcher.find(); } @Override public boolean hasMoreElements() { return currentPosition < content.length(); } @Override public Token nextElement() { boolean found = currentPosition > matcher.start() ? matcher.find() : true; int start = found ? matcher.start() : content.length(); int end = found ? matcher.end() : content.length(); if(found && currentPosition == start) { currentPosition = end; //  -   for (int i = 0; i < tokenTypes.length; i++) { String si = "g" + i; if (matcher.start(si) == start && matcher.end(si) == end) { return createToken(content, tokenTypes[i], start, end); } } } throw new IllegalStateException("      " + currentPosition); } /** *  -  ,    ,     , *            (, ) * @param content     * @param tokenType   * @param start      * @param end      * @return  - */ protected Token createToken(String content, ITokenType tokenType, int start, int end) { return new Token(content.substring(start, end), tokenType, start); } /** *     SQL */ public enum SQLTokenType implements ITokenType { KEYWORD("\\b(?:select|from|where|group|by|order|or|and|not|exists|having|join|left|right|inner)\\b"), ID("[A-Za-z][A-Za-z0-9]*"), REAL_NUMBER("[0-9]+\\.[0-9]*"), NUMBER("[0-9]+"), STRING("'[^']*'"), SPACE("\\s+"), COMMENT("\\-\\-[^\\n\\r]*"), OPERATION("[+\\-\\*/.=\\(\\)]"); private final String regex; SQLTokenType(String regex) { this.regex = regex; } @Override public String getRegex() { return regex; } } public static void main(String[] args) { String s = "select count(id) -- count of 'Johns' \n" + "FROM person\n" + "where name = 'John'"; RegexTokenizer tokenizer = new RegexTokenizer(s, SQLTokenType.values()); while(tokenizer.hasMoreElements()) { Token token = tokenizer.nextElement(); System.out.println(token.getText() + " : " + token.getType()); } } } /** * -  () */ public class Token { //   private final String text; //   private final ITokenType type; //      private final int start; public Token(String text, ITokenType type, int start) { this.text = text; this.type = type; this.start = start; } public String getText() { return text; } public ITokenType getType() { return type; } public int getStart() { return start; } } /** *     */ public interface ITokenType { /** *       */ String getRegex(); } 

рдЗрд╕ рд╡рд░реНрдЧ рдореЗрдВ, рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдХреЛ рдирд╛рдорд┐рдд рд╕рдореВрд╣реЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬреЛ рд╕рднреА рдЗрдВрдЬрдиреЛрдВ рдореЗрдВ рдореМрдЬреВрдж рдирд╣реАрдВ рд╣реИрдВред рдпрд╣ рд╕реБрд╡рд┐рдзрд╛ рдЖрдкрдХреЛ рдЕрдиреБрдХреНрд░рдордгрд┐рдХрд╛ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рд╕рдореВрд╣реЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддреА рд╣реИ, рд▓реЗрдХрд┐рди рдирд╛рдо рд╕реЗ, рдЬреЛ рдЕрдиреБрдХреНрд░рдордгрд┐рдХрд╛ рддрдХ рдкрд╣реБрдБрдЪрдиреЗ рд╕реЗ рдереЛрдбрд╝рд╛ рдЕрдзрд┐рдХ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд╣реИред


рдореЗрд░реЗ I7 2.3GHz рдкрд░, рдпрд╣ рд╡рд░реНрдЧ 5-20 рдПрдордмреА рдкреНрд░рддрд┐ рд╕реЗрдХрдВрдб (рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐рдпреЛрдВ рдХреА рдЬрдЯрд┐рд▓рддрд╛ рдХреЗ рдЖрдзрд╛рд░ рдкрд░) рдХреА рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдЧрддрд┐ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рддрд╛ рд╣реИред рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдХреЛ рдПрдХ рд╕рд╛рде рдХрдИ рдлрд╝рд╛рдЗрд▓реЛрдВ рдХрд╛ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХрд░рдХреЗ рд╕рдорд╛рдирд╛рдВрддрд░ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдЬрд┐рд╕рд╕реЗ рдХрд╛рдо рдХреА рд╕рдордЧреНрд░ рдЧрддрд┐ рдмрдврд╝ рдЬрд╛рддреА рд╣реИред


рдореБрдЭреЗ рдиреЗрдЯрд╡рд░реНрдХ рдкрд░ рдХрдИ рд╕рдорд╛рди рдПрд▓реНрдЧреЛрд░рд┐рджрдо рдорд┐рд▓реЗ, рд▓реЗрдХрд┐рди рдореЗрд░реЗ рдкрд╛рд╕ рдРрд╕реЗ рд╡рд┐рдХрд▓реНрдк рдереЗ рдЬреЛ рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рдирд┐рдпрдорд┐рдд рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдирд╣реАрдВ рдмрдирд╛рддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рд▓рд╛рдЗрди рдХреА рд╢реБрд░реБрдЖрдд рдХреЗ рд▓рд┐рдП рдкреНрд░рддреНрдпреЗрдХ рдкреНрд░рдХрд╛рд░ рдХреЗ рдЯреЛрдХрди рдХреЗ рд▓рд┐рдП рдирд┐рдпрдорд┐рдд рд░реВрдк рд╕реЗ рд▓рдЧрд╛рддрд╛рд░ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рд▓рд╛рдЧреВ рдХрд░рддреЗ рд╣реИрдВ, рдлрд┐рд░ рд▓рд╛рдЗрди рдХреА рд╢реБрд░реБрдЖрдд рд╕реЗ рдкрд╛рдП рдЧрдП рдЯреЛрдХрди рдХреЛ рдЫреЛрдбрд╝ рджреЗрдВ рдФрд░ рдлрд┐рд░ рд╕реЗ рд╕рднреА regexps рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░реЗрдВред рдпрд╣ рд▓рдЧрднрдЧ 10-20 рдмрд╛рд░ рдзреАрдорд╛ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ, рдЗрд╕рдХреЗ рд▓рд┐рдП рдЕрдзрд┐рдХ рдореЗрдореЛрд░реА рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ рдФрд░ рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдЕрдзрд┐рдХ рдЬрдЯрд┐рд▓ рд╣реЛрддрд╛ рд╣реИред рдореИрдВрдиреЗ рдХреЗрд╡рд▓ рдбреАрдПрдлрдП ( рдирд┐рд░реНрдзрд╛рд░рдХ рдкрд░рд┐рдорд┐рдд рд░рд╛рдЬреНрдп рдорд╢реАрди) рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдЕрдкрдиреЗ рдирд┐рдпрдорд┐рдд рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдХрд╛рдо рдХреА рдЕрдзрд┐рдХ рдЧрддрд┐ рдкреНрд░рд╛рдкреНрдд рдХреАред рд░реЗрдЧреЗрдХреНрд╕ рдЗрдВрдЬрдиреЛрдВ рдореЗрдВ, рдПрдирдХреЗрдП рдХрд╛ рдЖрдорддреМрд░ рдкрд░ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ - рдПрдХ рдиреЙрдирдбреЗрд░реНрдорд┐рдирд┐рд╕реНрдЯрд┐рдХ рдкрд░рд┐рдорд┐рдд рд░рд╛рдЬреНрдп рдорд╢реАрди)ред рдбреАрдПрдлрдП 2-3 рдЧреБрдирд╛ рддреЗрдЬ рд╣реИ, рд▓реЗрдХрд┐рди рдЗрд╕рдХреЗ рд▓рд┐рдП рдирд┐рдпрдорд┐рдд рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдСрдкрд░реЗрдЯрд░реЛрдВ рдХреЗ рд╕реАрдорд┐рдд рд╕реЗрдЯ рдХреЗ рдХрд╛рд░рдг рд▓рд┐рдЦрдирд╛ рдЕрдзрд┐рдХ рдХрдард┐рди рд╣реИред


рдПрд╕рдХреНрдпреВрдПрд▓ рдХреЗ рд▓рд┐рдП рдореЗрд░реЗ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ, рдореИрдВрдиреЗ рдирд┐рдпрдорд┐рдд рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐рдпреЛрдВ рдХреЛ рдереЛрдбрд╝рд╛ рд╕рд░рд▓ рдХрд┐рдпрд╛ рдФрд░ рдкрд░рд┐рдгрд╛рдореА рдЯреЛрдХрди рдХреЛ SQL рдкреНрд░рд╢реНрдиреЛрдВ рдХрд╛ рдПрдХ рдкреВрд░реНрдг-рд▓реЗрдХреНрд╕рд┐рдХрд▓ рд╡рд┐рд╢реНрд▓реЗрд╖рдХ рдирд╣реАрдВ рдорд╛рдирд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рд▓реЗрдЦ рдХрд╛ рдЙрджреНрджреЗрд╢реНрдп рд╕рд┐рджреНрдзрд╛рдВрдд рджрд┐рдЦрд╛рдирд╛ рд╣реИ, рдФрд░ рдПрдХ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдПрд╕рдХреНрдпреВрдПрд▓ рдЯреЛрдХрди рдмрдирд╛рдирд╛ рдирд╣реАрдВ рд╣реИред рдореИрдВрдиреЗ рдЕрдкрдиреЗ рдЕрднреНрдпрд╛рд╕ рдореЗрдВ рдЗрд╕ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдФрд░ SQL, Java, C, XML, HTML, JSON, рдкрд╛рд╕реНрдХрд▓ рдФрд░ рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ COBOL (рдореБрдЭреЗ рдЗрд╕рдХреЗ рд╕рд╛рде рдЯрд┐рдВрдХрд░ рдХрд░рдирд╛ рдкрдбрд╝рд╛) рдХреЗ рд▓рд┐рдП рдкреВрд░реНрдг-рд╡рд┐рдХрд╕рд┐рдд рд▓реЗрдХреНрд╕рд┐рдХрд▓ рд╡рд┐рд╢реНрд▓реЗрд╖рдХ рдмрдирд╛рдпрд╛ред


рд▓реЗрдХреНрд╕рд┐рдХрд▓ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХреЗ рд▓рд┐рдП рдирд┐рдпрдорд┐рдд рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рд▓рд┐рдЦрдиреЗ рдХреЗ рдХреБрдЫ рд╕рд░рд▓ рдирд┐рдпрдо рдпрд╣рд╛рдВ рджрд┐рдП рдЧрдП рд╣реИрдВред


  1. рдпрджрд┐ рдПрдХ рд╣реА рдЯреЛрдХрди рдХреЛ рд╡рд┐рднрд┐рдиреНрди рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЛ рд╕реМрдВрдкрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдХрд┐рд╕реА рднреА рдХреАрд╡рд░реНрдб рдХреЛ рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛ рдХреЗ рд░реВрдк рдореЗрдВ рдкрд╣рдЪрд╛рдирд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ), рддреЛ рд╢реБрд░реБрдЖрдд рдореЗрдВ рдПрдХ рд╕рдВрдХреАрд░реНрдг рдкреНрд░рдХрд╛рд░ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред рдлрд┐рд░ рдЗрд╕рдХреЗ рд▓рд┐рдП рдирд┐рдпрдорд┐рдд рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдкрд╣рд▓реЗ рд▓рд╛рдЧреВ рдХреА рдЬрд╛рдПрдЧреА рдФрд░ рдпрд╣ рдЯреЛрдХрди рдХреЗ рдкреНрд░рдХрд╛рд░ рдХреЛ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░реЗрдЧрд╛ред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдореЗрд░реЗ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ, рдХреАрд╡рд░реНрдб рдЖрдИрдбреА рд╕реЗ рдкрд╣рд▓реЗ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдП рдЧрдП рд╣реИрдВ рдФрд░ рдЪрдпрдирд┐рдд рдЯреЛрдХрди рдХреЛ рдХреАрд╡рд░реНрдб рдХреЗ рд░реВрдк рдореЗрдВ рдкрд╣рдЪрд╛рдирд╛ рдЬрд╛рдПрдЧрд╛, рдЖрдИрдбреА рдирд╣реАрдВ
  2. рдкрд╣рд▓реЗ рдЯреЛрдХрди рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░реЗрдВ, рдлрд┐рд░ рдЫреЛрдЯреЗ рд╡рд╛рд▓реЗред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдкрд╣рд▓реЗ <= , > = рдФрд░ рдлрд┐рд░ рдЕрд▓рдЧ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ < , = , = рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рдкрд╛рда <= рдХреЛ рдХрдо рдпрд╛ рдмрд░рд╛рдмрд░ рдСрдкрд░реЗрдЯрд░ рдХреЗ рдПрдХрд▓ рдЯреЛрдХрди рдХреЗ рд░реВрдк рдореЗрдВ рд╕рд╣реА рдврдВрдЧ рд╕реЗ рдкрд╣рдЪрд╛рдирд╛ рдЬрд╛рдПрдЧрд╛, рдФрд░ рджреЛ рдЕрд▓рдЧ рдЯреЛрдХрди < рдФрд░ = рдирд╣реАрдВ
  3. рд▓реБрдХрд╣реЗрдб рдФрд░ рд▓реБрдХрдмрд╛рдЗрдВрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╕реАрдЦреЗрдВред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, SQL рдореЗрдВ * рд╡рд░реНрдг рдХрд╛ рдЧреБрдгрди рдСрдкрд░реЗрдЯрд░ рдФрд░ рддрд╛рд▓рд┐рдХрд╛ рдХреЗ рд╕рднреА рдХреНрд╖реЗрддреНрд░реЛрдВ рдХрд╛ рдЕрд░реНрде рд╣реИред рдПрдХ рд╕рд░рд▓ рдЦреЛрдЬ рдХреЗ рдкреНрд░рдпреЛрдЧ рд╕реЗ , рдЖрдк рдЗрди рджреЛ рдорд╛рдорд▓реЛрдВ рдХреЛ рдЕрд▓рдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдпрд╣рд╛рдБ regexp ! <=! \ _ Sред Select \ s ) * рдХреЗрд╡рд▓ "рддрд╛рд▓рд┐рдХрд╛ рдХреЗ рд╕рднреА рдлрд╝реАрд▓реНрдб" рдорд╛рди рдореЗрдВ рд╡рд░реНрдг * рдвреВрдБрдврддрд╛ рд╣реИред
  4. рдкрд╛рда рдореЗрдВ рд╣реЛрдиреЗ рд╡рд╛рд▓реА рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЗ рд▓рд┐рдП рдирд┐рдпрдорд┐рдд рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐рдпреЛрдВ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдирд╛ рдХрднреА-рдХрднреА рдЙрдкрдпреЛрдЧреА рд╣реЛрддрд╛ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдпрджрд┐ рдЖрдк рд╡рд╛рдХреНрдп рд░рдЪрдирд╛ рд╣рд╛рдЗрд▓рд╛рдЗрдЯрд┐рдВрдЧ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдЖрдк рдЕрдзреВрд░реЗ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдЯреЛрдХрди рдХреЗ рдкреНрд░рдХрд╛рд░ рдХреЛ '[^\n\r]* рд░реВрдк рдореЗрдВ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдкрд╛рда рдХреЛ рд╕рдВрдкрд╛рджрд┐рдд рдХрд░рдиреЗ рдХреА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдореЗрдВ, рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЗ рдкрд╛рд╕ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдореЗрдВ рдЙрджреНрдзрд░рдг рдЪрд┐рд╣реНрди рдХреЛ рдмрдВрдж рдХрд░рдиреЗ рдХрд╛ рд╕рдордп рдирд╣реАрдВ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЖрдкрдХрд╛ рдЯреЛрдХрди рдЗрд╕ рд╕реНрдерд┐рддрд┐ рдХреЛ рд╕рд╣реА рдврдВрдЧ рд╕реЗ рдкрд╣рдЪрд╛рдирдиреЗ рдФрд░ рдЗрд╕реЗ рд╕рд╣реА рдврдВрдЧ рд╕реЗ рдЙрдЬрд╛рдЧрд░ рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдЧрд╛ред

рдЗрди рдирд┐рдпрдореЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдФрд░ рдЗрд╕ рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдирд╛, рдЖрдк рдкрд╛рда рдХреЛ рд▓рдЧрднрдЧ рдХрд┐рд╕реА рднреА рднрд╛рд╖рд╛ рдХреЗ рд▓рд┐рдП рдЯреЛрдХрди рдореЗрдВ рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

Source: https://habr.com/ru/post/hi462781/


All Articles