увеличить char_separator с цифрами - PullRequest
0 голосов
/ 07 декабря 2018

Можем ли мы использовать boost / tokenizer или boost :: char_separator для разделения с цифрами?

Допустим, у нас есть строка как:

1 *1:0 *2:0 0.01

Мы можем пробить выше линиис разделителем, несколькими разделителями с

boost::char_separator<char> space_star_sep{" ", ":"};

Это даст мне токены как:

1
*1 
:
0
*2
:
0
0.01

Если я использую один разделитель как

boost::char_separator<char> space_star_sep{" "};

, я получу:

1
*1:0
*2:0
0.01

Есть ли способ разбить строку по цифрам вместе с разделителями напрямую вместо получения токена и анализа.Скажем, если я хочу, чтобы токены были:

1
*1
*2
0.01

Я попытался дать общие вещи в char_seperator, такие как \ d et all, но они являются неизвестной последовательностью для разделителя символов.

Ответы [ 2 ]

0 голосов
/ 07 декабря 2018

Вы пытаетесь сделать две вещи здесь.

  1. Токенизация на пробелах
  2. Снимите трейлинг :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

( live demo )

(Отказ от ответственности: мы недостаточно знаем о входном синтаксисе и о ваших ожиданиях, чтобы гарантировать, что это точно.)

Я сознательно сохранил символ '*' в своем собственном захвате, поэтомучто вы можете обрабатывать числовую часть самостоятельно, без дальнейшего извлечения из строк;то есть вы можете передать захват B непосредственно std::stod и использовать capture A == "*" в качестве логического флага.

0 голосов
/ 07 декабря 2018

Если ваш вопрос, можете ли вы токенизировать строку, передав строку-разделитель ":0" в char_seperator или аналогичную функцию (скажем, strtok)?

По своему предназначению эти функции работают только с использованием одного символа в качестве разделителя или токенизатора.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...