Ноги дюймовые регулярные выражения "универсальных" комбинаций - PullRequest
1 голос
/ 20 марта 2020

Итак, существует множество вопросов и ответов о стандартных способах синтаксического анализа футов и дюймов с помощью регулярных выражений. Случайный поиск легко привел меня к: Link1 Link2

Но эти опции очень точно c с тем, что они ищут, и не достаточно универсальны для чего Я хотел бы сделать выражение. Желательно, чтобы я хотел, чтобы регулярное выражение соответствовало всем измерениям в футах, как показано ниже:

Примеры совпадений (12 и 3 и 1/4 - просто примеры, совпадения не должны быть строковыми (не только $)):

  • 12 '3 "
  • 12 футов 3 дюйма
  • 12 футов 3 дюйма
  • 12 футов 3 дюйма
  • 12 '-3 "
  • -12 футов 3 дюйма (должны фиксировать негативы)
  • 12'- 3" (Не следует принимать за -ve 3, но не обязательно для обработки с помощью регулярное выражение)
  • 12 '3 1/4 "
  • 12' 3.25"
  • 12 футов 3 1/4 дюйма
  • 12 '(необходимо захватить «единичные» размеры при условии, что они логически не соответствуют следующему или предыдущему)
  • 3 "
  • 3 1/4 дюйма
  • -3,25"
  • 3 1/4 фута

Желаемые несоответствия

  • 12 '12'
  • 3 дюйма 12 '
  • 3 дюйма 3 дюйма (необходимо сопоставить отдельно = соответствует 3 дюйма дважды)
  • 3 - 2 фута (необходимо исключить 3 и только совпадение -2 фута)

Я начал пытаться что-то написать и придумал:

/(-*[\d .]+(\/\d)* *){1}(?:FEET|FT\.*|'|INCH|INCHES|IN\.*|")+(?:[ -]*)/gi

Но он слишком жадный и принял бы 12 '12' как одно. Поэтому я начал делать некоторые исключения, например, что они делали в Link 1, но я не мог сделать так, чтобы это работало. Я попробовал это:

(-*[\d .]+(\/\d)* *){1}(?:FEET|FT\.*|'|INCH|INCHES|IN\.*|")+(?:[ -]*)(?!=(-*[\d .]+(\/\d)* *){1}(?:FEET|FT\.*|')+(?:[ -]*)){1,2}

, а также

((?<!((-*[\d .]+(\/\d)* *){1}(?:INCH|INCHES|IN\.*|")+)))(-*[\d .]+(\/\d)* *){1}(?:FEET|FT\.*|'|INCH|INCHES|IN\.*|")+(?:[ -]*)(?!=(-*[\d .]+(\/\d)* *){1}(?:FEET|FT\.*|')+(?:[ -]*)){1,2}

, и я попробовал некоторые другие подходы, такие как

(([-*\d+ *])+(?:FEET|FT\.*|')+(?:\s*-)*){0,1}((\s*\d+[./]*\d*\s*)+(?:INCH|INCHES|IN\.*|")+(?: )+){0,1}

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

Может быть, я просто недостаточно усматриваю или ищу правильные термины, но Я не думаю, что наткнулся на старый пост, в котором есть что-то столь же универсальное, как мне бы хотелось. Если ранее был ответ, который делает именно то, что я хотел бы, не стесняйтесь указать мне. Спасибо!

1 Ответ

1 голос
/ 20 марта 2020

Я придумал это регулярное выражение на основе предоставленных тестовых примеров:

/(?:-[ \t]*)?((?:\d+(?:\.\d*)?|(?:\d+[ \t]+)?\d+[ \t]*\/[ \t]*\d+)[ \t]*(?:[']|feet|ft\.?)(?:[ \t]*(?:-[ \t]*)?(?:\d+(?:\.\d*)?|(?:\d+[ \t]+)?\d+[ \t]*\/[ \t]*\d+)[ \t]*(?:["]|inch(?:es)?|in\.?))?|(?:(?:\d+(?:\.\d*)?|(?:\d+[ \t]+)?\d+[ \t]*\/[ \t]*\d+)[ \t]*(?:["]|inch(?:es)?|in\.?)))/g

Regex101

По сути, регулярное выражение построено как таковой:

  • (?:-[ \t]*)?: необязательный отрицательный знак
  • (?:\d+(?:\.\d*)?|(?:\d+[ \t]+)?\d+[ \t]*\/[ \t]*\d+): соответствует целому числу (например, 10), действительному числу (например, 3.45) или дробному номер (например, 3 1/4, 10/4). Обозначим эту часть как <number>, чтобы мы могли видеть большую картину
  • <number>[ \t]*(?:[']|feet|ft\.?): часть ног. Число и единица, необязательно, разделенные пробелом
  • <number>[ \t]*(?:["]|inch(?:es)?|in\.?): дюймовая часть. Часть ног. Число и единица, необязательно, разделенные пробелом
  • (<feet part>(?:[ \t]*(?:-[ \t]*)?<inch part>)?|(?:<inch part>)): Соответствует строке с ножной частью и дополнительной дюймовой частью (необязательно разделенной дефисом) или только дюймовой частью

Код предполагает все в одной строке - если вы хотите сопоставить между строками, замените [ \t] на \s.

Регулярное выражение будет подбирать допустимые подстроки в несоответствующих случаях - оно заботится только о том, что оно соответствует, допустимо, это не заботится о контексте матча.

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