Вы пытаетесь сделать две вещи здесь.
- Токенизация на пробелах
- Снимите трейлинг
:0
(или токенизируйте каждый токен на :
и получите первыйтокен)
Это две операции, которые нужно будет выполнить как таковые.
Ваши примеры char_seperator
выполняют токенизацию one , только с несколькими кандидатамиразделители.
Похоже, ваша попытка отойти от токенизации к сопоставлению с образцом, пытаясь извлечь подпоследовательности цифр из входной строки.Это нормально (и это может быть случай использования регулярных выражений), хотя он не соответствует предоставленному вами примеру вывода, поскольку ни *
, ни .
не является цифрой.
Я бы, наверное,Придерживайтесь двухфазного токенизации, хотя регулярное выражение для вашего варианта использования может выглядеть примерно так:
Pattern: /(\*)?(\d+(?:\.\d+)?)(?::0)?(?:\s+|$)/g
Input: "1 *1:0 *2:0 0.01"
| Captures:
+-----+-------
Match: | A | B
-------+-----+-------
#1 | | 1
#2 | * | 1
#3 | * | 2
#4 | | 0.01
(Отказ от ответственности: мы недостаточно знаем о входном синтаксисе и о ваших ожиданиях, чтобы гарантировать, что это точно.)
Я сознательно сохранил символ '*'
в своем собственном захвате, поэтомучто вы можете обрабатывать числовую часть самостоятельно, без дальнейшего извлечения из строк;то есть вы можете передать захват B непосредственно std::stod
и использовать capture A == "*" в качестве логического флага.