首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >带规则表达式的Java字符串拆分

带规则表达式的Java字符串拆分
EN

Stack Overflow用户
提问于 2018-05-09 16:10:51
回答 5查看 51关注 0票数 0

我远未掌握正则表达式,但我想在第一次和最后一次下划线上分割字符串,例如在第一次和最后一次下划线上用正则表达式分割字符串。

代码语言:javascript
复制
"hello_5_9_2018_world" 

to

"hello"
"5_9_2018"
"world"

我可以在最后一个下划线上用

代码语言:javascript
复制
String[] splitArray = subjectString.split("_(?=[^_]*$)");

但我无法弄清楚如何在第一个下划线上分开。

有人能告诉我怎么做吗?

谢谢大卫

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2018-05-09 16:33:59

虽然其他答案实际上更好更好,但如果您真的想使用split,这是一个好方法:

代码语言:javascript
复制
"hello_5_9_2018_world".split("((?<=^[^_]*)_)|(_(?=[^_]*$))")

==> String[3] { "hello", "5_9_2018", "world" }

这是您的前瞻性模式(_(?=[^_]*$))的组合。

和对称的后视模式:((?<=^[^_]*)_)

(匹配由_ (字符串的开始)和[^_]* (0.n非下划线字符)执行的[^_]*)。

票数 0
EN

Stack Overflow用户

发布于 2018-05-09 16:15:30

你不需要正则表达式就可以实现这一点。您可以通过查找_的第一个和最后一个索引并根据它们获取子字符串来实现这一点。

代码语言:javascript
复制
String s = "hello_5_9_2018_world";

int firstIndex = s.indexOf("_");
int lastIndex = s.lastIndexOf("_");

System.out.println(s.substring(0, firstIndex));
System.out.println(s.substring(firstIndex + 1, lastIndex));
System.out.println(s.substring(lastIndex + 1));

上述指纹

代码语言:javascript
复制
hello
5_9_2018
world

注意:

如果字符串没有两个_,您将得到一个StringIndexOutOfBoundsException

为了防止这种情况,您可以检查提取的索引是否有效。

  • 如果firstIndex == lastIndex == -1,则表示该字符串没有任何下划线。
  • 如果firstIndex == lastIndex,则该字符串只有一个下划线。
票数 6
EN

Stack Overflow用户

发布于 2018-05-09 16:17:06

正则表达式

代码语言:javascript
复制
(?<first>[^_]+)_(?<middle>.+)+_(?<last>[^_]+)

演示

Java代码

代码语言:javascript
复制
final String str = "hello_5_9_2018_world";
Pattern pattern = Pattern.compile("(?<first>[^_]+)_(?<middle>.+)+_(?<last>[^_]+)");
Matcher matcher = pattern.matcher(str);

if(matcher.matches()) {
    String first = matcher.group("first");
    String middle = matcher.group("middle");
    String last = matcher.group("last");
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50257781

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档