2016-09-26 29 views
1

假设我们有一个字符串:"((0.2,0), (1.5,0)) A1 ABC p"。我想把它分成像这样的逻辑单元:在分隔符上使用特定限制的分割字符串

((0.2,0), (1.5,0)) 
A1 
ABC 
p 

即,按照要求前一个字符不是逗号的空格拆分字符串。 是否可以使用regex作为解决方案?

更新:我已经试过这样:

#include <iostream> 
#include <string> 
#include <regex> 

int main() 
{ 
    std::string s = "((0.2,0), (1.5,0)) A1 ABC p"; 
    std::regex re("[^, ]*\\(, *[^, ]*\\)*"); // as suggested in the updated answers 
    std::sregex_token_iterator 
     p(s.begin(), s.end(), re, -1); 
    std::sregex_token_iterator end; 
    while (p != end) 
     std::cout << *p++ << std::endl; 
} 

结果是:((0.2,0), (1.5,0)) A1 ABC p

解决方案

#include <iostream> 
#include <string> 
#include <regex> 

int main() { 

    std::string s = "((0.2,0), (1.5,0)) A1 ABC p"; 

    std::regex re("[^, ]*(, *[^, ]*)*"); 
    std::regex_token_iterator<std::string::iterator> p(s.begin(), s.end(), re); 
    std::regex_token_iterator<std::string::iterator> end; 
    while (p != end) 
     std::cout << *p++ << std::endl; 
} 

输出:

((0.2,0), (1.5,0)) 

A1 

ABC 

p 
+0

@TobySpeight,感谢您的纠正我刚更新了一个代码片段的问题 –

+0

这还不完整(它缺少一个' main()',一件事),但它越来越近了。当你有编译的东西时,请更新。 –

回答

1

,你可以做这样的:

[^, ]*(, *[^, ]*)* 

是什么呢?

首先放开了基本的正则表达式:

的[]定义了一组要匹配,例如字符[AB]将匹配一个“A”或“B”。

如果使用[^]语法来描述所有不想匹配的字符,所以[^ ab]将匹配NOT和'a'或'b'的任何内容。

*符号告诉正则表达式,以前的匹配可以出现零次或多次。所以a *将匹配空字符串''或'a'或'aaa'或'aaaaaaaaaaaaa'

当你把()围绕创建一个组的表达式的一部分时,你可以使用in我们使用了它的情况,以便我们可以通过将*放在旁边来定义我们想要成为可选模式的一部分,以便它可以出现零次或多次。

好把所有在一起:

拳头部分[^,] *说:匹配零个或多个字符不是“”或“”像这样的WIL匹配字符串‘A1’或“((0.2 “

()*中的第二部分用于继续匹配字符串中有','和空格的字符串,但您不想分割,这部分是可选的,因此它可以正确匹配'A1'或' ABC'或'p'。

所以(,* [^,] *)*将匹配零个或多个以','开头的字符串和任何数字的'',后跟一个没有的字符串', '或'',所以在你的例子中它将匹配“,0)”,这是“((0.2”和也匹配“,(1.5”和再次“,0))”的延续,这将全部加在一起以使得“((0.2,0) ,(1.5,0))“

注意:您可能需要基于正在使用的正则表达式库来转义表达式中的某些字符。该解决方案将在这个在线测试仪http://www.regexpal.com/

工作,但一些库和工具需要你逃避的东西,如(

所以表达式将如下所示:

[^, ]*\(, *[^, ]*\)* 

而且我删除了(| $)部分是只有当你想要结尾空间成为比赛的一部分时才需要

+0

好吧,我明白了!感谢您的详细解答:) –