У меня есть следующее регулярное выражение для проверки данных:
lexer = /(?:
(.{18}|(?:.*)(?=\s\S{2,})|(?:[^\s+]\s){1,})\s*
(.{18}|(?:.*)(?=\s\S{2,})|(?:[^\s+]\s){1,})\s*
(?:\s+([A-Za-z][A-Za-z0-9]{2}(?=\s))|(\s+))\s*
(Z(?:RO[A-DHJ]|EQ[A-C]|HIB|PRO|PRP|RMA)|H(?:IB[2E]|ALB)|F(?:ER[2T]|LUP2|ST4Q))\s*
(\S+)\s*
(\S+)\s*
(\S+)\s*
(\S+)\s*
(\S+)\s*
(\S+)\s*
(\S+)\s*
(\S+)\s*
(\S+)\s*
(\S+)\s*
(\S+)\s*
(\S+)\s*
(\S+)\s*
(\S+)\s*
(\S+)\s*
(\s+\d{10}|\s+)\s*
(\d{6})\s*
(.*)(?=((?:\d{2}\/){2}\d{4}))\s*
((?:\d{2}\/){2}\d{4})\s*
(\S+)
)/x
Проблема заключается в том, что мне приходится перебирать файл с 10000 строками (в среднем), выполняя проверку с помощью регулярного выражения, что приводит кприложение медленного разбора.
filename = File.new(@file, "r")
filename.each_line.with_index do |line, index|
next if index < INFO_AT + 1
lexer = /(?:
(.{18}|(?:.*)(?=\s\S{2,})|(?:[^\s+]\s){1,})\s*
(.{18}|(?:.*)(?=\s\S{2,})|(?:[^\s+]\s){1,})\s*
(?:\s+([A-Za-z][A-Za-z0-9]{2}(?=\s))|(\s+))\s*
(Z(?:RO[A-DHJ]|EQ[A-C]|HIB|PRO|PRP|RMA)|H(?:IB[2E]|ALB)|F(?:ER[2T]|LUP2|ST4Q))\s*
(\S+)\s*
(\S+)\s*
(\S+)\s*
(\S+)\s*
(\S+)\s*
(\S+)\s*
(\S+)\s*
(\S+)\s*
(\S+)\s*
(\S+)\s*
(\S+)\s*
(\S+)\s*
(\S+)\s*
(\S+)\s*
(\S+)\s*
(\s+\d{10}|\s+)\s*
(\d{6})\s*
(.*)(?=((?:\d{2}\/){2}\d{4}))\s*
((?:\d{2}\/){2}\d{4})\s*
(\S+)
)/x
m = lexer.match(line)
begin
if (m) then ...
Редактировать Здесь вы можете найти некоторые строки, которые мне нужно проанализировать: Файл
Edit II @Mike R
Я анализирую файл, который содержит 25 столбцов в строке, и каждый столбец может иметь свой собственный способ проверки.Это может быть либо пробел, либо полный набор символов.
- Эта проверка необходима, поскольку мне нужно отбросить строку, которая не соответствует такой части.
- Возможноне нужно
- необходимо
Я не верю, что выражение плохо сконструировано, предвкушение используется, возможно, в той части, где я повторил код (я простоне помню индекс группы захвата \ 1 ... \ n, если это то, что вы имеете в виду!) Я также считаю, что здесь происходит катастрофический откат назад.
Если вы увидите файл, возможно, вы пойметепочему я это делаю!Давайте приведем в качестве примера первый столбец.Я должен соответствовать «номеру детали», и у меня нет никаких правил, как это сделать, примеры:
- 123456789
- 1 555 989
- 0123456789123456789
Ни простой \ S +, ни (\ S + \ s) {1,} не могут решить эту проблему, потому что я не гарантирую целостность данных.
Ты!
Есть какие-нибудь улучшения, предложения?
~ Eder Quiñones