Ваше текущее регулярное выражение не будет работать для строк, где Группа 3 или 4 содержит одно буквенное слово, потому что [a-zA-Z]+\\-?[a-zA-Z]+
соответствует 1+ буквам, затем необязательному дефису, а затем снова 1+ буквам (это означает, что должно быть в минимум 2 буквы). С [a-zA-Z]+(?:-[a-zA-Z]+)?
вы можете сопоставить 1+ букв, за которыми следует необязательная последовательность -
, а затем 1+ букв.
Кроме того, \s
также соответствует разрывам строк, и если строки заголовка короче, чем вы предполагаете, тогда .*
может по ошибке захватить строку последовательности. Вместо этого вы можете использовать \h
или [ \t]
.
Обратите внимание, что \n
не требуется в конце шаблона, поскольку .*
сопоставляет любые 0+ символов, кроме символов разрыва строки, с библиотекой регулярных выражений ICU (она используется в вашем текущем коде, str_replace_all
).
В общем, вы должны захватить только с (...)
то, что вам нужно сохранить, все остальное можно просто сопоставить. Удалите лишние захватывающие скобки, и это сохранит некоторую производительность.
Если вы добавите (?m)^
в начале, убедитесь, что вы соответствуете только >
в начале строки.
Вы можете использовать
"(?m)^>[A-Z]{2}\\d{6}\\.?\\d\\h+([a-zA-Z]+(?:-[a-zA-Z]+)?)\\h+([a-zA-Z]+(?:-[a-zA-Z]+)?).*"
См. Демонстрационную версию regex .
Код:
Sequence <- str_replace_all(SequenceRaw,
"(?m)^>[A-Z]{2}\\d{6}\\.?\\d\\h+([a-zA-Z]+(?:-[a-zA-Z]+)?)\\h+([a-zA-Z]+(?:-[a-zA-Z]+)?).*",
"\\1 \\2")