我们是否也可以使用boost/记号器或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,但是它们对于char分隔符来说是一个未知的序列。
发布于 2018-12-07 15:03:21
如果您的问题是,可以通过将分隔符字符串":0"传递到char_seperator或类似的函数(例如strtok)来标记字符串吗?
不是的。
根据它们的意图,这些函数只通过使用单个字符作为分隔符或令牌来工作。
发布于 2018-12-07 16:08:22
你在这里想做两件事。
:0 (或在:上标记每个令牌并获取第一个令牌)这是两个操作,需要这样执行。
您的char_seperator示例只使用多个候选分隔符执行一次标记化。
听起来,您的尝试是从标记化转向模式匹配,尝试从输入字符串中提取数字的子序列。这很好(并且可能是正则表达式的用例),尽管它与您提供的示例输出不匹配,因为*和.都不是数字。
我可能会坚持两个阶段的标记化,尽管您的用例的正则表达式可能看起来有点像这样:
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 == "*“作为布尔标志。
https://stackoverflow.com/questions/53664298
复制相似问题