Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

2013 09 21 регулярные выражения

1,965 views

Published on

  • Be the first to comment

2013 09 21 регулярные выражения

  1. 1. Школа  Разработки  Интерфейсов  Яндекса   Симферополь,  2013   Руководитель  группы  разработки  интерфейсов   Рекламной  Сети  Яндекса   Макс  Ширшин   Регулярные  выражения  
  2. 2. Вместо  предисловия   2  
  3. 3. Виды  регулярных  выражений   •  POSIX  (BRE,  ERE)   •  PCRE  =  Perl-­‐CompaYble  Regular  Expressions   3   Цитата  из  стандарта  языка  JavaScript:   «Вид  и  функциональность  регулярных   выражений  в  JavaScript  реализованы   по  подобию  подсистемы  регулярных   выражений  в  языке  программирования  Perl  5»  
  4. 4. 4   JS-­‐синтаксис  (очень  кратко)   var  re  =  /^foo/;                                                                                                                                                        
  5. 5. 5   JS-­‐синтаксис  (очень  кратко)   var  re  =  /^foo/;     //  boolean   re.test('строка');                                                                                      
  6. 6. 6   JS-­‐синтаксис  (очень  кратко)   var  re  =  /^foo/;     //  boolean   re.test('строка');         //  null  или  Array   re.exec('строка');  
  7. 7. 7   Из  чего  состоят  регэкспы                                                                                                                                                                                                    
  8. 8. 8   Из  чего  состоят  регэкспы   1.  Символы                                                                                                                                                                                  
  9. 9. 9   Из  чего  состоят  регэкспы   1.  Символы                                                                           2.  Операции                                                                                      
  10. 10. 10   Из  чего  состоят  регэкспы   1.  Символы   —  обычные                                                         2.  Операции                                                                                      
  11. 11. 11   Из  чего  состоят  регэкспы   1.  Символы   —  обычные   —  специальные  (метасимволы)   2.  Операции                                                                                      
  12. 12. 12   Из  чего  состоят  регэкспы   1.  Символы   —  обычные   —  специальные  (метасимволы)   2.  Операции   —  квантификация                                                        
  13. 13. 13   Из  чего  состоят  регэкспы   1.  Символы   —  обычные   —  специальные  (метасимволы)   2.  Операции   —  квантификация   —  перечисление                            
  14. 14. 14   Из  чего  состоят  регэкспы   1.  Символы   —  обычные   —  специальные  (метасимволы)   2.  Операции   —  квантификация   —  перечисление   —  группировка  
  15. 15. Метасимволы   8  
  16. 16. /./.test('foo');    //  true     /./.test('rn')    //  false                                                                                                                                                                                     16   Любой  символ  
  17. 17. /./.test('foo');    //  true     /./.test('rn')    //  false         Что  вы  хотели  на  самом  деле:   /[sS]/  для  JS      или   /./s  (не  работает  в  JS)                 17   Любой  символ  
  18. 18. >>>  /^something$/.test('something')   true                                                                                                                                                                                                                 18   Границы  строк  
  19. 19. >>>  /^something$/.test('something')   true     >>>  /^something$/.test('somethingnbad')   false                                                                                                             19   Границы  строк  
  20. 20. >>>  /^something$/.test('something')   true     >>>  /^something$/.test('somethingnbad')   false     >>>  /^something$/m.test('somethingnbad')   true         20   Границы  строк  
  21. 21. >>>  /ba/.test('alabama)   true                                                                                                                                                                                                                           21   Граница  слова  
  22. 22. >>>  /ba/.test('alabama)   true   >>>  /ab/.test('alabama')   true                                                                                                                                                         22   Граница  слова  
  23. 23. >>>  /ba/.test('alabama)   true   >>>  /ab/.test('alabama')   true     >>>  /ab/.test('naïve')   true                                                                                         23   Граница  слова  
  24. 24. >>>  /ba/.test('alabama)   true   >>>  /ab/.test('alabama')   true     >>>  /ab/.test('naïve')   true     не-­‐граница  слова   /Ba/.test('alabama');   24   Граница  слова  
  25. 25. Символьные  классы   12  
  26. 26. /s/  (инвертированный  вариант  /S/)                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                   26   Пробельные  символы  
  27. 27. /s/  (инвертированный  вариант  /S/)     FF:   t          n          v          f          r          u0020  u00a0   u1680  u180e  u2000  u2001  u2002  u2003  u2004   u2005  u2006  u2007  u2008  u2009  u200a  u2028   u2029  u202f  u205f  u3000     Chrome  19,  IE  9:   как  в  FF  12  и  ещё  ufeff     IE  7,  8  :-­‐(   только:   t  n  v  f  r  u0020     27   Пробельные  символы  
  28. 28. /d/  ~  цифры  от  0  до  9     /w/  ~  буквы,  цифры  и  подчёркивание   В  JS  не  работает  для  русских  букв!     И  наоборот:   /D/  ~  всё,  кроме  цифр   /W/  ~  всё,  кроме  букв  и  цифр   28   Буквы  и  цифры  
  29. 29. Пример:   /[abc123]/                                                                                                                                                                                                                                                                                                                                                                                                                                                                   29   Произвольные  классы  символов  
  30. 30. Пример:   /[abc123]/         Работают  метасимволы  и  диапазоны:   /[A-­‐Fd]/                                                                                                                                                                                                                                                                                                                                                                 30   Произвольные  классы  символов  
  31. 31. Пример:   /[abc123]/         Работают  метасимволы  и  диапазоны:   /[A-­‐Fd]/         Можно  указать  несколько  диапазонов:   /[a-­‐cG-­‐M0-­‐7]/                                                                                                                                                                                                                                                   31   Произвольные  классы  символов  
  32. 32. Пример:   /[abc123]/         Работают  метасимволы  и  диапазоны:   /[A-­‐Fd]/         Можно  указать  несколько  диапазонов:   /[a-­‐cG-­‐M0-­‐7]/         ВАЖНО:  диапазоны  берутся  из  Юникода.   При  работе  с  кириллическими  диапазонами   проверьте  порядок  символов  в  Юникоде!   32   Произвольные  классы  символов  
  33. 33. символ  «точка»  —  просто  точка!   /[.]/.test('anything')  //  false                                                             33   Произвольные  классы  символов  
  34. 34. символ  «точка»  —  просто  точка!   /[.]/.test('anything')  //  false     символы:    ]  -­‐   /[]-­‐]/     34   Произвольные  классы  символов  
  35. 35. всё,  кроме  a,  b,  c:   /[^abc]/         ^  как  символ:   /[abc^]/   35   Инвертированные   символьные  классы  
  36. 36. Квантификаторы   18  
  37. 37. /bo*/.test('b')  //  true                                                                                                                             37   Ноль  или  более,  один  или   более  
  38. 38. /bo*/.test('b')  //  true     /.*/.test('')      //  true                                                                         38   Ноль  или  более,  один  или   более  
  39. 39. /bo*/.test('b')  //  true     /.*/.test('')      //  true         /bo+/.test('b')  //  false               39   Ноль  или  более,  один  или   более  
  40. 40. /colou?r/.test('color');   /colou?r/.test('colour');     40   Ноль  или  один  
  41. 41. 41   Диапазоны  повторов   /bo{7}/        точно  7                                                                                                                                                                                                                      
  42. 42. 42   Диапазоны  повторов   /bo{7}/        точно  7     /bo{2,5}/    от  2  до  5,  x  <  y                                                                                                                                                          
  43. 43. 43   Диапазоны  повторов   /bo{7}/        точно  7     /bo{2,5}/    от  2  до  5,  x  <  y             /bo{5,}/      5  или  более                                                                                                
  44. 44. 44   Диапазоны  повторов   /bo{7}/        точно  7     /bo{2,5}/    от  2  до  5,  x  <  y             /bo{5,}/      5  или  более             в  JS  не  работает!   /b{,5}/.test('bbbbb')  
  45. 45. var  r  =  /a+/.exec('aaaaa');                                                           45   Жадные  (greedy)   квантификаторы  
  46. 46. var  r  =  /a+/.exec('aaaaa');         >>>  r[0]                                 46   Жадные  (greedy)   квантификаторы  
  47. 47. var  r  =  /a+/.exec('aaaaa');         >>>  r[0]   "aaaaa"               47   Жадные  (greedy)   квантификаторы  
  48. 48. var  r  =  /a+?/.exec('aaaaa');                                                                                                                       48   Ленивые  (lazy)  квантификаторы  
  49. 49. var  r  =  /a+?/.exec('aaaaa');   >>>  r[0]                                                                                                   49   Ленивые  (lazy)  квантификаторы  
  50. 50. var  r  =  /a+?/.exec('aaaaa');   >>>  r[0]   "a"                                                                                         50   Ленивые  (lazy)  квантификаторы  
  51. 51. var  r  =  /a+?/.exec('aaaaa');   >>>  r[0]   "a"         r  =  /a*?/.exec('aaaaa');                               51   Ленивые  (lazy)  квантификаторы  
  52. 52. var  r  =  /a+?/.exec('aaaaa');   >>>  r[0]   "a"         r  =  /a*?/.exec('aaaaa');   >>>  r[0]           52   Ленивые  (lazy)  квантификаторы  
  53. 53. var  r  =  /a+?/.exec('aaaaa');   >>>  r[0]   "a"         r  =  /a*?/.exec('aaaaa');   >>>  r[0]   ""   53   Ленивые  (lazy)  квантификаторы  
  54. 54. Группировки   24  
  55. 55. с  захватом   /(boo)/.test("boo");                                                                                 55   Группировки  
  56. 56. с  захватом   /(boo)/.test("boo");     без  захвата   /(?:boo)/.test("boo");     56   Группировки  
  57. 57. var  result  =  /(bo)o+(b)/.exec('the  booooob');                                                                                                                                                                                                                                   57   Группировки  и  конструктор  RegExp
  58. 58. var  result  =  /(bo)o+(b)/.exec('the  booooob');   >>>  RegExp.$1   "bo"                                                                                                                                                                                         58   Группировки  и  конструктор  RegExp
  59. 59. var  result  =  /(bo)o+(b)/.exec('the  booooob');   >>>  RegExp.$1   "bo"   >>>  RegExp.$2   "b"                                                                                                                                                 59   Группировки  и  конструктор  RegExp
  60. 60. var  result  =  /(bo)o+(b)/.exec('the  booooob');   >>>  RegExp.$1   "bo"   >>>  RegExp.$2   "b"   >>>  RegExp.$9   ""                                                                                                             60   Группировки  и  конструктор  RegExp
  61. 61. var  result  =  /(bo)o+(b)/.exec('the  booooob');   >>>  RegExp.$1   "bo"   >>>  RegExp.$2   "b"   >>>  RegExp.$9   ""   >>>  RegExp.$10   undefined                                                       61   Группировки  и  конструктор  RegExp
  62. 62. var  result  =  /(bo)o+(b)/.exec('the  booooob');   >>>  RegExp.$1   "bo"   >>>  RegExp.$2   "b"   >>>  RegExp.$9   ""   >>>  RegExp.$10   undefined   >>>  RegExp.$0   undefined   62   Группировки  и  конструктор  RegExp
  63. 63.    /((foo)  (b(a)r))/                                                                                                                                                                                                                               63   Порядок  нумерации  группировок
  64. 64.    /((foo)  (b(a)r))/     $1  (                          )      foo  bar                                                                                                                                                                 64   Порядок  нумерации  группировок
  65. 65.    /((foo)  (b(a)r))/     $1  (                          )      foo  bar     $2    (      )                        foo                                                                                                           65   Порядок  нумерации  группировок
  66. 66.    /((foo)  (b(a)r))/     $1  (                          )      foo  bar     $2    (      )                        foo   $3                (          )        bar                                                       66   Порядок  нумерации  группировок
  67. 67.    /((foo)  (b(a)r))/     $1  (                          )      foo  bar     $2    (      )                        foo   $3                (          )        bar   $4                    (  )            a       67   Порядок  нумерации  группировок
  68. 68. var  r  =  /best(?=  match)/.exec('best  match');                                                                                                                                                                               68   Lookahead  
  69. 69. var  r  =  /best(?=  match)/.exec('best  match');     >>>  !!r   true                                                                                                                                               69   Lookahead  
  70. 70. var  r  =  /best(?=  match)/.exec('best  match');     >>>  !!r   true     >>>  r[0]   "best"                                                                                                         70   Lookahead  
  71. 71. var  r  =  /best(?=  match)/.exec('best  match');     >>>  !!r   true     >>>  r[0]   "best"         >>>  /best(?!  match)/.test('best  match')   false   71   Lookahead  
  72. 72. Перечисление   30  
  73. 73. /red|green|blue  light/   /(red|green|blue)  light/         >>>  /var  a(;|$)/.test('var  a')   true   73   Логическое  «или»  
  74. 74. true   /(red|green)  apple  is  1/.test('red  apple  is  red')     true   /(red|green)  apple  is  1/.test('green  apple  is  green')   74   Backreferences   (обратные  ссылки)  
  75. 75. Представление  символов   32  
  76. 76. x09  ===  t  (не  Unicode,  для  ASCII/ANSI)   u20AC  ===  €  (для  Unicode)                                                                                                                                                                                                                                                                                                                                               76   Представление  символов  
  77. 77. x09  ===  t  (не  Unicode,  для  ASCII/ANSI)   u20AC  ===  €  (для  Unicode)     обратный  slash  убирает  специальное   значение  у  символа   /()/.test('()')    //  true   /n/.test('n')    //  true                                                                                                             77   Представление  символов  
  78. 78. x09  ===  t  (не  Unicode,  для  ASCII/ANSI)   u20AC  ===  €  (для  Unicode)     обратный  slash  убирает  специальное   значение  у  символа   /()/.test('()')    //  true   /n/.test('n')    //  true     иногда  верно  и  обратное   /f/.test('f')    //  false!   78   Представление  символов  
  79. 79. Флаги   34  
  80. 80. g  i  m  s  x                                                                                                                                                                                                                                                                     80   Флаги  в  регулярных  выражениях  
  81. 81. g  i  m  s  x             global  match                                                                                                                                                                                                                               81   Флаги  в  регулярных  выражениях  
  82. 82. g  i  m  s  x             global  match   ignore  case                                                                                                                                                                                                     82   Флаги  в  регулярных  выражениях  
  83. 83. g  i  m  s  x             global  match   ignore  case   multiline  matching  for  ^  and  $                                                                                                                                     83   Флаги  в  регулярных  выражениях  
  84. 84. g  i  m  s  x             global  match   ignore  case   multiline  matching  for  ^  and  $     нет  поддержки  в  JS  для:   string  as  single  line   extend  pattern   84   Флаги  в  регулярных  выражениях  
  85. 85. /(?i)foo/   /(?i-­‐m)bar$/   /(?i-­‐sm).x$/   /(?i)foo(?-­‐i)bar/             Не  все  реализации  поддерживают   переключение  флагов  внутри  regexp.       JS  при  таком  синтаксисе  включает  флаги  на   весь  regexp  сразу  и  не  даёт  менять.   85   Альтернативный  синтаксис   для  флагов  
  86. 86. RegExp  в  JavaScript   86  
  87. 87. экземпляры  RegExp:      /regexp/.exec('строка')              null  или  массив  ['всё  совпадение',  $1,  $2,  ...]      /regexp/.test('строка')              false  или  true             экземпляры  String:      'str'.match(/regexp/)      'str'.match('w{1,3}')              -­‐  эквивалент  /regexp/.exec,  если  нет  флага  g;              -­‐  массив  всех  совпадений  по  строке,  если  есть  флаг  g   (внутренние  группировки  игнорируются)                'str'.search(/regexp/)      'str'.search('w{1,3}')              позиция  первого  совпадения  или  -­‐1   87   Методы  
  88. 88. экземпляры  String:   'str'.replace(/old/,  'new');             В  строке  замены  поддерживаются  следующие  спецсимволы:          $$      вставляет  значок  доллара  "$"          $&      подстрока,  совпавшая  с  регэкспом          $`      подстрока  до  $&          $'      подстрока  после  $&            $1,  $2,  $3  и  т.д.:  cтрока,  совпавшая  с  соответствующей   скобочной  группировкой             'str'.replace(/(r)(e)gexp/g,          function(matched,  $1,  $2,  offset,  sourceString)  {                  //  чем  заменить  matched  на  этом  шаге?                  return  'замена';   });   88   Методы  
  89. 89. //  ПЛОХО   var  re  =  new  RegExp('^'  +  userInput  +  '$');   var  userInput  =  '[abc]';         //  ХОРОШО   RegExp.escape  =  function(text)  {      return  text.replace(/[-­‐[]{}()*+?.,^$|#s]/g,  "$&");   };             var  re  =  new  RegExp('^'  +  RegExp.escape(userInput)  +  '$');   89   RegExp  injecYon  
  90. 90. Что  почитать   90  
  91. 91. 91   В  интернете:   javascript.ru/basic/regular-­‐expression   Mastering  Regular  Expressions   O'Reilly  Media   Книга:  
  92. 92. Что  поделать   92  
  93. 93. 93   Кроссворд  из  регулярных  выражений       clck.ru/8pyrR   clck.ru/8pyrm  
  94. 94. Вопросы?   94  
  95. 95. Руководитель  группы   разработки  интерфейсов   Рекламной  Сети  Яндекса   ingdir@yandex-­‐team.ru   @ingdir   Макс  Ширшин  

×