获取和跳过字符串组?

Posted

技术标签:

【中文标题】获取和跳过字符串组?【英文标题】: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 是否可以完成这项工作。但是什么都想不出来。

【问题讨论】:

【参考方案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)

【讨论】:

以上是关于获取和跳过字符串组?的主要内容,如果未能解决你的问题,请参考以下文章

Apollo GraphQl 分页 - 限制和跳过

最大和跳过两个连续整数

多线程增量和跳过 0 没有锁?

C++ 调试 LoadImage() 和跳过断点

为啥分页插件和跳过/限制在那个 mongodb 查询中不起作用?

phpmailer 列循环和跳过 NULL