Java 每个单词的起始索引

Java 每个单词的起始索引,java,regex,Java,Regex,我想得到字符串中每个单词的起始索引。单词由任何非空白字符定义 String test = "this that and that"; Matcher matcher = Pattern.compile("\\s+[WHAT TO WRITE HERE]\\s+").matcher(test); while (matcher.find()) { System.out.println(matcher.start()); } 我应该

我想得到字符串中每个单词的起始索引。单词由任何非空白字符定义

String test = "this that and that";
        Matcher matcher = Pattern.compile("\\s+[WHAT TO WRITE HERE]\\s+").matcher(test);
        while (matcher.find()) {
          System.out.println(matcher.start());
        }
我应该在正则表达式中写什么?例如,输出应为0,5,10,14
单词之间可以有多个空格。

我将使用以下正则表达式:

...
Matcher matcher = Pattern.compile("[^\\s]+").matcher(test);
...

我会使用这个正则表达式:

...
Matcher matcher = Pattern.compile("[^\\s]+").matcher(test);
...
单词由任何非空白字符定义

还有一个字符类:
\S

因此,您的正则表达式应该是:

private static final Pattern PATTERN = Pattern.compile("\\S+");
但是请注意,您对“单词”的定义相当大;这还包括标点符号等

至于您的循环,这是正确的,因为当您有一个匹配时,
Matcher
.start()
方法确实会包含匹配开始的索引

将您的代码稍加修改,这将提供:

String test = "this that and that";
Matcher matcher = PATTERN.matcher(test);
while (matcher.find()) {
    System.out.println(matcher.start());
}
单词由任何非空白字符定义

还有一个字符类:
\S

因此,您的正则表达式应该是:

private static final Pattern PATTERN = Pattern.compile("\\S+");
但是请注意,您对“单词”的定义相当大;这还包括标点符号等

至于您的循环,这是正确的,因为当您有一个匹配时,
Matcher
.start()
方法确实会包含匹配开始的索引

将您的代码稍加修改,这将提供:

String test = "this that and that";
Matcher matcher = PATTERN.matcher(test);
while (matcher.find()) {
    System.out.println(matcher.start());
}
我将使用:

[A-Za-z0-9]+
它将只找到字母数字单词。 我认为“\S+”会有标点符号和奇怪字符的问题。 如果需要,您甚至可以删除数字(“0-9”)部分。

我会使用:

[A-Za-z0-9]+
它将只找到字母数字单词。 我认为“\S+”会有标点符号和奇怪字符的问题。
如果你愿意,你甚至可以删除数字(“0-9”)部分。

@fge已经给出了最好的答案,但因为我无法回复他的评论@Ian McGrath你在问你本可以写出什么,还有其他解决方案。这就是我想到的,它似乎也起了作用

Matcher matcher = Pattern.compile("\\w+?(\\s+|$)").matcher(test);

@fge已经给出了最好的答案,但因为我无法回复他的评论@Ian McGrath你在问你本可以写出什么,还有其他解决方案。这就是我想到的,它似乎也起了作用

Matcher matcher = Pattern.compile("\\w+?(\\s+|$)").matcher(test);

为什么不直接匹配
“\\S+”
?你能把它作为一个答案吗?我会接受的。但是出于好奇,有没有办法像我这样做呢;您的循环是正确的,并且执行您希望它执行的操作。没问题。为什么不直接匹配
“\\S+”
?你能把它作为答案吗?我会接受的。但是出于好奇,有没有办法像我这样做呢;您的循环是正确的,并且执行您希望它执行的操作。没问题。但这是什么动物?@Casimirithippolyte什么动物?我的化身?@fge,谢谢。您的答案确实是我所问的,但除了“得到”正确答案之外,我还想知道如何使用正则表达式使其工作。我想学习而不是得到答案。你能告诉我我能写些什么吗?@IanMcGrath嗯,你说你想打印每个单词开头的索引;您的while循环是正确的。你还想要什么?如何返回索引列表?@fge,不,我想知道我可以在代码中的“在这里写什么”中写些什么。如果有办法的话。但是这是什么动物?@Casimirithippolyte什么动物?我的化身?@fge,谢谢。您的答案确实是我所问的,但除了“得到”正确答案之外,我还想知道如何使用正则表达式使其工作。我想学习而不是得到答案。你能告诉我我能写些什么吗?@IanMcGrath嗯,你说你想打印每个单词开头的索引;您的while循环是正确的。你还想要什么?如何返回索引列表?@fge,不,我想知道我可以在代码中的“在这里写什么”中写些什么。如果有办法的话。