Учебники и введение в шаблоны выражений C ++

Почтовые индексы могут быть изменены, и единственным истинным способом проверки почтового индекса является полный список почтовых индексов и посмотреть, существует ли он.

Но регулярные выражения полезны, потому что они:

  • просты в использовании и реализованы
  • , короткие
  • быстро запускаются
  • , довольно просты в обслуживании (по сравнению с полным список почтовых индексов)
  • по-прежнему улавливают большинство ошибок ввода

Но регулярные выражения, как правило, трудно поддерживать, особенно для тех, кто не придумал его в первое место. Таким образом, это должно быть:

  • как можно проще понять
  • относительно будущего доказательства

Это означает, что большинство регулярных выражений в этом ответе недостаточно. Например. Я вижу, что [A-PR-UWYZ][A-HK-Y][0-9][ABEHMNPRV-Y] будет соответствовать области почтового индекса формы AA1A - но это будет боль в области шеи, если и когда добавится новая область почтового индекса, потому что трудно понять, в каких областях почтового индекса это соответствует.

Я также хочу, чтобы мое регулярное выражение соответствовало первой и второй половине почтового индекса в скобках.

Итак, я придумал следующее:

(GIR(?=\s*0AA)|(?:[BEGLMNSW]|[A-Z]{2})[0-9](?:[0-9]|(?<=N1|E1|SE1|SW1|W1|NW1|EC[0-9]|WC[0-9])[A-HJ-NP-Z])?)\s*([0-9][ABD-HJLNP-UW-Z]{2})

В формате PCRE его можно записать следующим образом:

/^
  ( GIR(?=\s*0AA) # Match the special postcode "GIR 0AA"
    |
    (?:
      [BEGLMNSW] | # There are 8 single-letter postcode areas
      [A-Z]{2}     # All other postcode areas have two letters
      )
    [0-9] # There is always at least one number after the postcode area
    (?:
      [0-9] # And an optional extra number
      |
      # Only certain postcode areas can have an extra letter after the number
      (?<=N1|E1|SE1|SW1|W1|NW1|EC[0-9]|WC[0-9])
      [A-HJ-NP-Z] # Possible letters here may change, but [IO] will never be used
      )?
    )
  \s*
  ([0-9][ABD-HJLNP-UW-Z]{2}) # The last two letters cannot be [CIKMOV]
$/x

Для меня это правильный баланс между валидацией, насколько это возможно, и в то же время будущая проверка и удобство обслуживания .

10
задан grrussel 29 March 2010 в 07:20
поделиться

3 ответа

Вы должны получить копию C ++ Templates: The Complete Guide .

В примере кода, на который вы ссылаетесь, нет сопроводительного текста, что очень полезно (глава о шаблонах выражений занимает 22 страницы). Без текста все, что у вас есть, - это код без каких-либо комментариев или объяснений того, что он делает, как и почему он это делает.

5
ответ дан 3 December 2019 в 23:12
поделиться

У вас есть все исходники, кроме научной книги по C ++, которая на самом деле всего лишь оригинальная статья (в любом случае по отношению к этой теме) и довольно необычная датирован. Вы можете посмотреть на метапрограммирование шаблонов C ++, чтобы узнать о более современных методах, построенных на идеях шаблонов выражений, но что-то «простое» не будет легкодоступным, пока оно не станет простым.

0
ответ дан 3 December 2019 в 23:12
поделиться

Я предлагаю ознакомиться с операторами повышения в Операторы повышения - арифметика . Это шаблонные методы, расширяющие фундаментальные арифметические операции и операции сравнения.

0
ответ дан 3 December 2019 в 23:12
поделиться
Другие вопросы по тегам:

Похожие вопросы: