Мне нужно создать регулярное выражение, которое соответствует клиентским кодам, которые выглядят так:
- ХХХ/Х{3,6}
- ХХХ.Х{3,6}
- ХХХ.Х{3,6}/ХХХ
С X число от 0 до 9.
Регулярное выражение должно быть достаточно сильным, чтобы мы не извлекали коды, находящиеся в другой строке. Использование границ слов было моей первой идеей. Регулярное выражение выглядит так: \b\d{3}[\.\/]\d{3,6}(?:\/\d{3})?\b
Проблема с границами слов заключается в том, что они также соответствуют точкам. Таким образом, номер типа 123/456.12 будет соответствовать 123/456 в качестве номера клиента. Итак, я придумал следующее регулярное выражение: (?<!\S)\d{3}[\.\/]\d{3,6}(?:\/\d{3})?(?!\S)
. Он использует просмотр назад и просмотр вперед и проверяет, является ли этот символ пробелом. Это правильно соответствует большинству клиентских кодов.
Но есть еще одна последняя проблема. Мы используем текст Google OCR для извлечения кодов. Это означает, что допустимый код может быть найден в тексте, таком как 123/456\n
, \n123/456
, \n123/456\n
и т. д. Проверка того, являются ли предыдущий и/или следующий символы пробелами, не работает, потому что литерал \n не включен в это. Если я делаю что-то вроде (?<!\S|\\n)
в качестве границы слова, по какой-то причине он также включает обратную и/или прямую косую черту. В настоящее время я придумал следующее регулярное выражение (?<![^\r\n\t\f\v n])\d{3}[\.\/]\d{3,6}(?:\/\d{3})?(?![^\r\n\t\f\v \\])
, но оно проверяет только, является ли предыдущий символ n или пробелом, а следующий - обратной косой чертой или пробелом. Таким образом, такие строки, как lorem\123/456, все равно найдут совпадение. Мне нужен какой-то способ включить \n в символы пробела, не нарушая просмотр вперед/просмотр назад.
Ребята, у вас есть идеи, как решить эту проблему? Все входные данные приветствуются. Спасибо!
\S
внутри внешних обходов. Внешние обходные пути ограничивают контекст соответствия\d{3}[./]\d{3,6}(?:/\d{3})?
. 31.05.2021