如何在第n个分隔符出现之前进行子字符串化?

时间:2018-12-13 15:16:53

标签: java string split

first;snd;3rd;4th;5th;6th;...

;分隔符第三次出现后如何拆分以上内容?特别是不必将整个字符串作为数组value.split(";"),因为我不需要将值分开。只是字符串的第一部分,直到第n次出现。

所需的输出为: first;snd;3rd。 我只需要将其作为字符串子字符串,而不是作为分割的单独值。

7 个答案:

答案 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));