我使用几种语言处理字符串然后让我感到困扰的是如何从字符串中选择字符或切片(子字符串)。就像我们可以从字符串或特定位置的字符获取子字符串,但我无法找到任何方法或运算符返回特定长度的特定切片跳过特定字符。以下是解释。
假设我有以下字符串:I am an example string.
从这个字符串中,我希望能够得到一组字符串,例如长度2
并跳过某些字符,让我们说{{1} }。现在为了让事情变得更有趣,让我们说我可以从任何索引开始,对于这个例子,我们将采用3
。所以我应该从上述条件得到的字符串应该是:5
。下图(anam sng
为拍摄,*
为跳过)。
!
我知道你可以使用计数变量实现这一点,这些变量跟踪每个字符是否采用 ** ** ** **
I am an example string.
| !!! !!! !!! !
Start Position --+
条件。但我正在考虑一种数学方法,或者甚至是某种语言的内置方法或运算符,可以完成这项工作。
我还搜索了Regex是否可以胜任这项工作。但是无法想出任何东西。
答案 0 :(得分:1)
通用解决方案:当第一组替换所有出现的正则表达式start
时,跳过第一个(.{0,n}).{0,m}
个字符。
的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:]))
爪哇:
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");
答案 1 :(得分:0)
正则表达式可以做到。你只需要更努力一点:)
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
答案 2 :(得分:0)
Python没有这种切片,你必须使用循环。但你可以用理解列表来做到这一点:
Action
使用RegEx,您可以匹配组中的两个长度的字符串和三个长度的字符串。
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)