Во-первых, начнем с простой версии:
(\d{10} # 10 digits
(?:\s+\w+)+) # some text, separated by spaces,
# at least one time
(?!\s*\d+\.\d+) # not followed by a decimal number
Я изменил свой [A-Za-z0-9]
к \w
для простоты, и позволил ей произойти столько раз, сколько он хочет.
Однако это также будет соответствовать второй строке - оно будет сожрать 23
в конце, а затем увидеть, что это не имеет десятичного числа (за ним следует «.23»), поэтому он будет соответствовать ,
Чтобы предотвратить это, мы можем сказать, что это должно сопровождаться пробелом или в конце текста:
(\d{10}(?:\s+\w+)+)
(?=\s|$) # it must be followed by a space or end of text
(?!\s*\d+\.\d+)
Однако, это все еще есть проблемы. Теперь он будет соответствовать «... XMF», но затем увидите, что за ним следует десятичное число и обратный путь. Он вернется к «... VBGF», а затем будет соответствовать, так как после «VBGF» не следует десятичное число.
Чтобы предотвратить это, мы можем сказать, регулярное выражение, что он не может возвращаться назад, как только она соответствует нашей основной раздел:
(?> # added '?>': not allowed to backtrack once this group is matched
\d{10}(?:\s+\w+)+)
(?=\s|$)(?!\s*\d+\.\d+)
Попеременно, если вы знаете, что всегда будет 2 части в SOMETEXT , это также решит обратное отслеживание:
(\d{10}(?:\s+\w+){2} # can only occur twice
)
(?=\s|$)(?!\s*\d+\.\d+)
Neat ... отлично работает! Большое спасибо! – Abryan