Итак, существует множество вопросов и ответов о стандартных способах синтаксического анализа футов и дюймов с помощью регулярных выражений. Случайный поиск легко привел меня к: 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}
и работает так, как я хотел, но также соответствует множеству пустых строк.
Может быть, я просто недостаточно усматриваю или ищу правильные термины, но Я не думаю, что наткнулся на старый пост, в котором есть что-то столь же универсальное, как мне бы хотелось. Если ранее был ответ, который делает именно то, что я хотел бы, не стесняйтесь указать мне. Спасибо!