精华内容
下载资源
问答
  • 声明: 翻译仅以技术学习和交流为目的,如需转载请务必标明原帖链接。...C++ 切分字符串的最优雅的方式是什么?我们假定字符串中每个单词分隔符是空格。(备注:我对C的字符串函数或者那种字符...

    声明:

    • 翻译仅以技术学习和交流为目的,如需转载请务必标明原帖链接。
    • http://stackoverflow.com/questions/236129/how-to-split-a-string-in-c

    水平有限,如有翻译不当,欢迎探讨、批评与指正。

    帖子内容:

    C++ 切分字符串的最优雅的方式是什么?我们假定字符串中每个单词分隔符是空格。(备注:我对C的字符串函数或者那种字符处理/存取方式不是很感兴趣。因此,请优先选择优雅而不是效率)


    我现在能想到的最好的方式是:

    #include <iostream>
    #include <sstream>
    #include <string>
    using namespace std;
    
    int main()
    {
        string s("Somewhere down the road");
        istringstream iss(s);
    
        do
        {
            string sub;
            iss >> sub;
            cout << "Substring: " << sub << endl;
        } while (iss);
    
        return 0;
    }

    另一种方式去萃取输入字符串的分隔符,使用标准库函数很容易实现。下面是使用 STL 的设计方案(健壮并且优雅):

    #include <iostream>
    #include <string>
    #include <sstream>
    #include <algorithm>
    #include <iterator>
    
    int main() {
        using namespace std;
        string sentence = "Something in the way she moves...";
        istringstream iss(sentence);
        copy(istream_iterator<string>(iss),
                 istream_iterator<string>(),
                 ostream_iterator<string>(cout, "\n"));
    }

    如果想要把分割后的字符串放到一个容器中,而不是控制台的话,使用相同的泛型算法即可。

    vector tokens;
        copy(istream_iterator(iss),
             istream_iterator(),
             back_inserter >(tokens));[/c]

    评:这种方案只能分割空格,没有伸缩性。


    使用 boost 库:

    std::vector strs;
    boost::split(strs, "string to split", boost::is_any_of("\t "));

    我打赌这个要比使用 stringstream 快的多。并且这是一个泛型模板方法,它可以用来分割任意类型的字符串(wchar,etc. or UTF-8),使用任意的分隔符。具体请看文档

    评:不是每个人都用 boost 的。


    把 delim 作为作为分隔符,第一个函数把结果放到一个已经存在构造好了的 vector 中,第二个函数返回一个新的 vector。

    std::vector &split(const std::string &s, char delim, std::vector &elems) {
        std::stringstream ss(s);
        std::string item;
        while(std::getline(ss, item, delim)) {
            elems.push_back(item);
        }
        return elems;
    }
    
    std::vector split(const std::string &s, char delim) {
        std::vector elems;
        return split(s, delim, elems);
    
    }

    注意:这种方法不能跳过空的符号,比如下面有四个数据项,其中的一个是空的。

    std::vector x = split("one:two::three", ':');
    template < class ContainerT >
    void tokenize(const std::string& str, ContainerT& tokens,
                  const std::string& delimiters = " ", const bool trimEmpty = false)
    {
       std::string::size_type pos, lastPos = 0;
       while(true)
       {
          pos = str.find_first_of(delimiters, lastPos);
          if(pos == std::string::npos)
          {
             pos = str.length();
    
             if(pos != lastPos || !trimEmpty)
                tokens.push_back(ContainerT::value_type(str.data()+lastPos,
                      (ContainerT::value_type::size_type)pos-lastPos ));
    
             break;
          }
          else
          {
             if(pos != lastPos || !trimEmpty)
                tokens.push_back(ContainerT::value_type(str.data()+lastPos,
                      (ContainerT::value_type::size_type)pos-lastPos ));
          }
    
          lastPos = pos + 1;
       }
    };
    #include <vector>
    #include <string>
    #include <sstream>
    
    using namespace std;
    
    int main()
    {
        string str("Split me by whitespaces");
        string buf; // Have a buffer string
        stringstream ss(str); // Insert the string into a stream
    
        vector<string> tokens; // Create vector to hold our words
    
        while (ss >> buf)
            tokens.push_back(buf);
    
    }

    笔者注:

    • 文中的优雅也就是我们平时所说的代码美感。
    • 本来打算把所有的英文都翻译过来的,后来发现很多实在是难以拿捏。所以后面就直接贴了代码,其实对于我们经常看代码的人,代码也许要比文字直观的多。上文代码我在 vs2010 上验证无误。
    展开全文
  • C++如何切分字符串

    2014-12-06 21:58:56
    http://www.perfect-is-shit.com/stackoverflow-split-string.html 摘其中一种方法: #include #include #include using namespace std;...怎么把字符串按空格切分字符串转成数字

    http://www.perfect-is-shit.com/stackoverflow-split-string.html

    摘其中一种方法:

    #include <vector>
    #include <string>
    #include <sstream>
    
    using namespace std;
    
    int main()
    {
        string str("Split me by whitespaces");
        string buf; // Have a buffer string
        stringstream ss(str); // Insert the string into a stream
    
        vector<string> tokens; // Create vector to hold our words
    
        while (ss >> buf)
            tokens.push_back(buf);
    
    }


    怎么把字符串按空格切分

    把字符串转成数字

    展开全文
  • 下面是最简单的解释:我是这么用的 re.split('\W', 'foo/bar spam\neggs') -> ['foo', 'bar', 'spam', 'eggs'] 但是我想要的是下面这样的 ...因为我想将一个字符串拆分成标记,操纵它,然后再将它重新组合在一起。

    下面是最简单的解释:我是这么用的

    re.split('\W', 'foo/bar spam\neggs')
    -> ['foo', 'bar', 'spam', 'eggs']
    

    但是我想要的是下面这样的

    #Python学习交流QQ群:778463939
    someMethod('\W', 'foo/bar spam\neggs')
    -> ['foo', '/', 'bar', ' ', 'spam', '\n', 'eggs']
    

    因为我想将一个字符串拆分成标记,操纵它,然后再将它重新组合在一起。

    答:

     >>> re.split('(\W)', 'foo/bar spam\neggs')
    ['foo', '/', 'bar', ' ', 'spam', '\n', 'eggs']
    
    展开全文
  • 如何使用不同分隔符切分字符串,把某个字符串依据分隔符拆分,该字符包含不同的多种分隔符,如下 s = '12;;7.osjd;.jshdjdknx+' 其中 ; . + 是分隔符 有哪些解决方案? 方法1:通过str.split()方法,每次处理一个...

    如何使用不同分隔符切分字符串,把某个字符串依据分隔符拆分,该字符包含不同的多种分隔符,如下

    s = '12;;7.osjd;.jshdjdknx+' 其中 ; . + 是分隔符
    

    有哪些解决方案?

    方法1:通过str.split()方法,每次处理一个分隔符

    #!/usr/bin/python3
    def go_split(s, symbol):
        result = [s]
        for i in symbol:
            median = []
            # 普通方法
            # for x in result:
            #     median.extend(x.split(i)
            # 列表解析
            # [median.extend(y.split(i)) for y in result if y]
            # map高阶函数,map生成可迭代对象
            for z in map(lambda x: x.split(i), result):
                median.extend(z)      
            # 以上三个方法都可以解决问题
            result = median   
        # 去除空字符串
        return [x for x in result if x]
    if __name__ == "__main__":
        # 定义初始字符串
        s = '12;;7.osjd;.jshdjdknx+'
        # 定义分隔符
        symbol = ';./+'
        result = go_split(s, symbol)
        print(result)
    

    方法2:通过re.split()方法,一次性拆分所有字符串,推荐

    #!/usr/bin/python3
    import re
    
    def go_split(s, symbol):
        # 拼接正则表达式
        symbol = "[" + symbol + "]+"
        # 一次性分割字符串
        result = re.split(symbol, s)
        # 去除空字符
        return [x for x in result if x]
    
    if __name__ == "__main__":
        # 定义初始字符串
        s = '12;;7.osjd;.jshdjdknx+'
        # 定义分隔符
        symbol = ';./+'
        result = go_split(s, symbol)
        print(result)
    

    一个文本转语音的小程序,对文本进行分割后,一句话一句话的读出来:

    # -*- coding: utf-8 -*-
    # 遇到问题没人解答?小编创建了一个Python学习交流QQ群:778463939
    # 寻找有志同道合的小伙伴,互帮互助,群里还有不错的视频学习教程和PDF电子书!
    import pyttsx3
    import re
    import os
    engine = pyttsx3.init()
    # 分割原文
    def go_split(s, symbol):
        # 拼接正则表达式
        symbol = "[" + symbol + "]+"
        # 一次性分割字符串
        result = re.split(symbol, s)
        # 去除空字符
        return [x for x in result if x]
    # 判断字符串只包含中文:
    def reflag(list):
        for i in range(len(list)):
            for ch in list[i]:
                if ch >= '\u4e00' and ch <= '\u9fa5':
                    return i
    def reader(list,flag):
        if flag == None:
            print("本文没有中文翻译")
        else:
            print("本文有中文翻译")
        lenght = len(list)
        i = 0
        while i <lenght:
            instr = input("输入操作:"+"\n"
                          "1:继续听读本句话"+"\n"
                          "2:继续听读下一句话"+"\n"+":")
            if instr=="1":
                engine.say(list[i])
                print(list[i])
                engine.runAndWait()
            if instr == "2":
                i = i + 1
                print(list[i])
                engine.say(list[i])
                engine.runAndWait()
        print(list)
    def start():
        dirlsit= os.listdir('reader')
        for i in range(len(dirlsit)):
            print(str(i)+":"+str(dirlsit[i]))
        choice = int(input("输入选择的文章序号:"))
        with open("reader/"+dirlsit[choice],'r',encoding='utf-8') as f:
            article = f.read()
            article = article.replace('\n', '')
            # 定义分隔符
            symbol = ',;.:'
            list = go_split(article,symbol)
            if filsh(list):
                flag = reflag(list) - 1
            else:flag=None
            rate = engine.getProperty('rate')
            engine.setProperty('rate', rate-25)
            reader(list,flag)
    
    start()
    

    文章格式:

    Night after night, she came to tuck me in, even long after my childhood years. Following her longstanding custom, she'd lean down and push my long hair out of the way, then kiss my forehead.
    I don't remember when it first started annoying me — her hands pushing my hair that way. But it did annoy me, for they felt work-worn and rough against my young skin. Finally, one night, I shouted out at her, "Don't do that anymore —your hands are too rough!" She didn't say anything in reply. But never again did my mother close out my day with that familiar expression of her love.
    Time after time, with the passing years, my thoughts returned to that night. By then I missed my mother's hands, missed her goodnight kiss on my forehead. Sometimes the incident seemed very close, sometimes far away. But always it lurked, in the back of my mind.
    Well, the years have passed, and I'm not a little girl anymore. Mom is in her mid-seventies, and those hands I once thought to be so rough are still doing things for me and my family. She's been our doctor, reaching into a medicine cabinet for the remedy to calm a young girl's stomach or soothe the boy's scraped knee. She cooks the best fried chicken in the world... gets stains out of blue jeans like I never could...
    Now, my own children are grown and gone. Mom no longer has Dad, and on special occasions, I find myself drawn next door to spend the night with her. So it was late on Thanksgiving Eve, as I slept in the bedroom of my youth, a familiar hand hesitantly run across my face to brush the hair from my forehead. Then a kiss, ever so gently, touched my brow.
    In my memory, for the thousandth time, I recalled the night my young voice complained, "Don't do that anymore — your hands are too rough!" Catching Mom's hand in hand, I blurted out how sorry I was for that night. I thought she'd remember, as I did. But Mom didn't know what I was talking about. She had forgotten — and forgiven — long ago.
    That night, I fell asleep with a new appreciation for my gentle mother and her caring hands. And the guilt that I had carried around for so long was nowhere to be found.
    【中文译文】:
    母亲总是在我入睡之后,为我掖好被子,然后俯下身子,轻轻拨开覆在我脸上的长发,亲吻我的前额。日复一日,母亲一直保持着这个习惯,即使我已不再是小孩子了,这一切却依然故我。
    不知从什么时候开始,母亲的这种习惯渐渐让我感到不悦----我不喜欢她那双布满老茧的手就这样划过我细嫩的皮肤。终于,在一个夜晚,我忍不住冲她吼了起来:“你不要再这样了,你的手好粗糙!”母亲无言以对。但从此却再没有用这种我熟悉的表达爱的方式来为我的一天画上句号。
    日子一天天过去,随着时间的流逝,我却总是不由得想起那一夜。我开始想念母亲的那双手,想念她印在我前额上的“晚安”。这种渴望忽远忽近,但始终潜藏在我心灵深处的某个角落。
    若干年后,我成熟了,已不再是个小女孩了。母亲也已到了古稀之年,可她却始终没有停止过操劳,用她那双曾经被我视为“粗糙”的手为我和我的家庭做着力所能及的事情。她是我们的家庭医生,小姑娘胃痛时,她会从药箱里找出胃药来,小男孩擦伤的膝盖时,她会去安抚他的伤痛。她能做出世界上最好吃的炸鸡,能把蓝色牛仔裤上的污渍去得毫无痕迹......
    现在,我自己的孩子也已长大,有了自己的生活,母亲却没有了父亲的陪伴。有一次,恰好是感恩节前夜,我决定就睡在母亲旁边的卧室里,陪她度过这一夜。这是我儿时的卧室,一切都是那么的熟悉,还有一只熟悉的手犹豫着从我的脸上掠过,梳理着我前额的头发,然后,一个吻,带着一如往日的温柔,轻轻落在了我的额头。
    在我的记忆里,曾几千次再现那晚的情景和我那稚嫩的抱怨声:“你不要再这样了,你的手好粗糙!”我一把抓住母亲的手,一股脑说出我对那一晚深深的愧疚。我想,她一定和我一样,对那晚的事历历在目。然而,母亲却不知我再说些什么-----她早忘了,早已原谅我了。
    那天晚上,我带着对母亲新的感激安然入睡,我感激她的温柔,和她那呵护的双手。多年来压在我心头的负罪感也随之烟消云散。
    
    展开全文
  • string str="我是小松鼠hsgg()jsjg776sdf"; string [] sArray=Regex.Split(str,"[hs][()]",RegexOptions.IgnoreCase); int i =1; ...foreach (string s in sArray) ... Console.WriteLine("i,{0},len:{1},s:{2}...
  • Console.WriteLine("原字符串{0}:{1}", (i++).ToString(), str); string[] r = str.SplitByLen(charNum, "{0}/{1}){2}"); foreach (string s in r) { Console.WriteLine("{0}", s); } Console....
  • //' '将按空格来切分,所以不再有空格出现    string[] arr = (str ??  string.Empty).Split( new  char[] {  ',',  '\t',  '\n',  ' ' }, StringSplitOptions.RemoveEmptyEntries);   ...
  • } /// /// /// 按字符串长度切分成数组 /// /// 原字符串 /// 切分长度 /// 前缀格式 /// 字符串数组 public static string[] SplitByLen(this string str, int separatorCharNum, string prefixFormat) { string...
  • 一同事问:有一字符串“abcdefghijklmn”如何用Python来切分,每四个一段,剩下的算一段。字符段切分,首先会想到split()和 re.split()函数,但仔细想了一下,这两个函数又不合适,因为,字符之间并没有空格,逗号...
  • using System;... Console.WriteLine("本次切分后数组的长度为:{0}", arr.Length); int i = 1; foreach (string s in arr) { Console.WriteLine("{0}:{1}", (i++).ToString(), s); } } } }
  • Python切分字符串的一个不错方法

    千次阅读 2017-11-11 10:21:36
    一同事问:有一字符串“abcdefghijklmn”如何用Python来切分,每一个一段,剩下的算一段。字符段切分,首先会想到split()和 re.split()函数,但仔细想了一下,这两个函数又不合适,因为,字符之间并没有空格,逗号...
  • .split()如果字符串中存在多个不同参数(例如逗号后面没有空格,单词之间有不同的符号),如何切分? A: split为Python自带函数,能够实现的功能您可以参考一下官方doc,...
  • 在Python中如何字符串中的子串拼接字符串呢?思路大致是先把子串切分出来,然后遍历每个子串再进行拼接。 下面我们举例一个Python给以逗号为分隔的每个字符串拼接字符串 例如给如下两个 test_1 = “8080,443,80” ...
  • Problem Description Following the account of Jules Verne, a scrambled message written by the middle age alchemist Arne Saknussemm, and deciphered by professor Lidenbrock, started the incredible ...
  • 给定一个字符串如何得到其中重复模式最高的子字符串,我采用的方法是使用滑窗机制,对给定的字符串切分,窗口的大小从1增加到字符串长度减1,将所有的得到的切片统计结果,在这里不考虑单个字符的重复模式,好了,...
  • 现有形如下面形式的字符串(单引号之间的部分是一个单元,单元之间以逗号分开),字符串为:'2012-06-20 00:00:00,017', 'INFO', 'quartzScheduler_Worker-10' 如何用正则提取出单引号部分(第一个引号单元内容里面有...
  • 给你一个字符串 s,请你将 s 分割成一些子串,使每个子串都是回文。 返回符合要求的 最少分割次数 。 示例 1: 输入:s = "aab" 输出:1 解释:只需一次分割就可将s 分割成 ["aa","b"] 这样两个回文子串。 示例...
  • 给定一个字符串如何得到其中重复模式最高的子字符串,我采用的方法是使用滑窗机制,对给定的字符串切分,窗口的大小从1增加到字符串长度减1,将所有的得到的切片统计结果,在这里不考虑单个字符的重复模式,好了,...
  • 给定一个字符串如何得到其中重复模式最高的子字符串,我采用的方法是使用滑窗机制,对给定的字符串切分,窗口的大小从1增加到字符串长度减1,将所有的得到的切片统计结果,在这里不考虑单个字符的重复模式,好了,...
  • 2、当字符串最后一位或者N位是分隔符时,前者不会继续切分,而后者继续切分。即前者不保留null值,后者保留。 下面看例子: public static void main(String[] args) { String str="a,,b,c,,,"; String[] split1 =...

空空如也

空空如也

1 2 3 4 5
收藏数 99
精华内容 39
关键字:

如何切分字符串