first;snd;3rd;4th;5th;6th;...
在;
分隔符第三次出现后如何拆分以上内容?特别是不必将整个字符串作为数组value.split(";")
,因为我不需要将值分开。只是字符串的第一部分,直到第n次出现。
所需的输出为:
first;snd;3rd
。
我只需要将其作为字符串子字符串,而不是作为分割的单独值。
答案 0 :(得分:2)
使用来自Apache的StringUtils.ordinalIndexOf()
在字符串中查找第n个索引,处理为null。此方法使用String.indexOf(String)。
参数:
str-要检查的字符串,可以为
searchStr-要查找的字符串,可以为
ordinal-要查找的第n个searchStr
返回: 搜索字符串的第n个索引,如果没有匹配项或输入的字符串为空,则为-1(INDEX_NOT_FOUND)
或this way, no libraries required:
library(dplyr)
df %>%
group_by_at(-(1:5)) %>%
do( onerow(.) %>% t %>% as.data.frame ) %>%
ungroup
答案 1 :(得分:2)
我会简单,简单地使用它:
String test = "first;snd;3rd;4th;5th;6th;";
int result = 0;
for (int i = 0; i < 3; i++) {
result = test.indexOf(";", result) +1;
}
System.out.println(test.substring(0, result-1));
输出:
第一;第二;第三
您可以使用所需的参数数量在循环中更改3
答案 2 :(得分:2)
如果要使用正则表达式,这非常简单:
import re
value = "first;snd;3rd;4th;5th;6th;"
reg = r'^([\w]+;[\w]+;[\w]+)'
re.match(reg, value).group()
输出:
"first;snd;3rd"
更多选项here。
答案 3 :(得分:1)
您可以使用正则表达式,该正则表达式使用否定的character class来从字符串开头而不是分号进行匹配。
然后重复2次与分号匹配的分组结构,然后再进行1次以上的分号匹配。
^[^;]+(?:;[^;]+){2}
说明
^
断言字符串的开头[^;]+
否定的字符类不能匹配分号1次以上(?:
启动非捕获组;[^;]+
匹配分号和1+次而不是分号){2}
关闭非捕获组并重复2次例如:
String regex = "^[^;]+(?:;[^;]+){2}";
String string = "first;snd;3rd;4th;5th;6th;...";
Pattern pattern = Pattern.compile(regex);
Matcher matcher = pattern.matcher(string);
if (matcher.find()) {
System.out.println(matcher.group(0)); // first;snd;3rd
}
请参见Java demo
答案 4 :(得分:0)
如果不想使用split,只需在for循环中使用indexOf即可知道第3个和第4个“;”的索引然后在这些索引之间做一个子字符串。
此外,您还可以使用与3rd匹配的正则表达式进行拆分;但这可能不是最佳解决方案。
答案 5 :(得分:0)
如果需要经常执行此操作,最好在静态Pattern实例中预先编译正则表达式:
0 info it worked if it ends with ok
1 verbose cli [ '/usr/bin/node', '/usr/bin/npm', 'run', 'dev' ]
2 info using npm@5.8.0
3 info using node@v8.11.2
4 verbose run-script [ 'predev', 'dev', 'postdev' ]
5 info lifecycle @~predev: @
6 info lifecycle @~dev: @
7 verbose lifecycle @~dev: unsafe-perm in lifecycle true
8 verbose lifecycle @~dev: PATH: /usr/share/npm/node_modules/npm-lifecycle/node-gyp-bin:/var/www/html/pms/node_modules/.bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
9 verbose lifecycle @~dev: CWD: /var/www/html/pms
10 silly lifecycle @~dev: Args: [ '-c', 'npm run development' ]
11 silly lifecycle @~dev: Returned: code: 1 signal: null
12 info lifecycle @~dev: Failed to exec dev script
13 verbose stack Error: @ dev: `npm run development`
13 verbose stack Exit status 1
13 verbose stack at EventEmitter.<anonymous> (/usr/share/npm/node_modules/npm-lifecycle/index.js:283:16)
13 verbose stack at emitTwo (events.js:126:13)
13 verbose stack at EventEmitter.emit (events.js:214:7)
13 verbose stack at ChildProcess.<anonymous> (/usr/share/npm/node_modules/npm-lifecycle/lib/spawn.js:55:14)
13 verbose stack at emitTwo (events.js:126:13)
13 verbose stack at ChildProcess.emit (events.js:214:7)
13 verbose stack at maybeClose (internal/child_process.js:925:16)
13 verbose stack at Process.ChildProcess._handle.onexit (internal/child_process.js:209:5)
14 verbose pkgid @
15 verbose cwd /var/www/html/pms
16 verbose Linux 4.18.0-3-amd64
17 verbose argv "/usr/bin/node" "/usr/bin/npm" "run" "dev"
18 verbose node v8.11.2
19 verbose npm v5.8.0
20 error code ELIFECYCLE
21 error errno 1
22 error @ dev: `npm run development`
22 error Exit status 1
23 error Failed at the @ dev script.
23 error This is probably not a problem with npm. There is likely additional logging output above.
24 verbose exit [ 1, true ]
将“ 3”替换为所需的元素数。
答案 6 :(得分:0)
在以下代码中查找“;”的第三次出现的索引字符并创建子字符串。
String s = "first;snd;3rd;4th;5th;6th;";
String splitted = s.substring(0, s.indexOf(";", s.indexOf(";", s.indexOf(";") + 1) + 1));