【问题标题】:Taking and skipping groups of strings?获取和跳过字符串组?
【发布时间】:2016-11-06 06:34:34
【问题描述】:

我使用了几种语言的字符串,然后我很困扰我们如何从字符串中选择字符或切片(子字符串)。就像我们可以从字符串或特定位置的字符中获取子字符串一样,但我找不到任何方法或运算符返回特定长度的特定切片跳过特定字符。下面是解释。

所以假设我有以下字符串:I am an example string. 从这个字符串中,我希望能够获得长度为2 的字符串组并跳过某些字符,比如3。现在为了让事情变得更有趣,假设我可以从任何索引开始,对于这个例子,我们将采用5。所以我应该从上述条件中得到的字符串应该是:anam sng。下图(* 拍摄,! 跳过)。

                                    **   **   **   **
                               I am an example string.
                                    | !!!  !!!  !!!  !
                   Start Position --+

我知道您可以使用计数变量来实现这一点,这些变量跟踪每个字符是否使用if 条件。但我正在考虑一种数学方法,甚至可能是某些语言中的内置方法或运算符可以完成这项工作。

我还搜索了 Regex 是否可以完成这项工作。但是什么都想不出来。

【问题讨论】:

    标签: java python c++ string


    【解决方案1】:

    通用解决方案:当用第一组替换所有出现的正则表达式 (.{0,n}).{0,m} 时,跳过第一个 start 字符。

    Python:

    import re
    
    input = 'I am an example string.'
    n = 2
    m = 3
    start = 5
    
    print(re.sub('(.{0,%d}).{0,%d}' % (n, m), "\\1", input[start:]))
    

    Java:

    final String input = "I am an example string.";
    final int n = 2;
    final int m = 3;
    final int start = 5;
    
    final String regex = String.format("(.{0,%d}).{0,%d}", n, m);
    System.out.println(input.substring(start).replaceAll(regex, "$1"));
    

    C++11:

    string input = "I am an example string.";
    int n = 2;
    int m = 3;
    int start = 5;
    
    stringstream s;
    s << "(.{0," << n << "}).{0," << m << "}";
    regex r(s.str());
    cout << regex_replace(input.substr(start), r, "$1");
    

    【讨论】:

      【解决方案2】:

      正则表达式可以。你只需要再努力一点:)

      public static void main(String[] args) {
          String s = "I am an example stringpppqq";
          Pattern p = Pattern.compile("(.{1,2})(?:.{3}|.{0,2}$)");
          int index = 5;
          Matcher m = p.matcher(s);
          StringBuilder sb = new StringBuilder();
          while (index < s.length() && m.find(index)) {
              System.out.println(m.group(1));
              sb.append(m.group(1));
              index = index + 5;
              System.out.println(index);
          }
          System.out.println(sb);
      }
      

      O/P:

      anam sngqq
      

      【讨论】:

        【解决方案3】:

        Python 没有这种切片,你必须使用循环。但是您可以使用理解列表来做到这一点:

        text = 'I am a sample string'
        
        s = 5  # start position
        l = 2  # slice length
        d = 3  # distance between slices
        
        chunks = [text[p:p + l] for p in range(s, len(text),  l + d]
        result = ''.join(chunks)
        

        使用正则表达式,您可以匹配组中的两个长度的字符串和一个三个长度的字符串。

        import re
        
        regex = r'(..)...'
        
        found = re.findall(regex, text[s:])  # list of tuples
        result = ''.join(f[0] for f in found)
        

        【讨论】:

          猜你喜欢
          • 2016-05-16
          • 2022-11-24
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多