6

我有一个包含一个句子的字符串,我想根据一个单词将它分成两半。我有一个正则表达式(\\w+) word,我认为它可以让我得到“word”+“word”本身之前的所有单词,然后我可以删除最后四个字符。

但是,这似乎不起作用..任何想法我做错了什么?

谢谢。

4

5 回答 5

10

这似乎有效:

import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class Test {
    public static void main(String[] args) {
        Pattern p = Pattern.compile("([\\w\\s]+) word");
        Matcher m = p.matcher("Could you test a phrase with some word");
        while (m.find()) {
            System.err.println(m.group(1));
            System.err.println(m.group());
        }
    }
}
于 2012-05-02T20:02:21.960 回答
5

使用字符串操作:

int idx = sentence.indexOf(word);
if (idx < 0)
  throw new IllegalArgumentException("Word not found.");
String before = sentence.substring(0, idx);

使用正则表达式:

Pattern p = Pattern.compile(Pattern.quote(word));
Matcher m = p.matcher(sentence);
if (!m.find())
  throw new IllegalArgumentException("Word not found.");
String before = sentence.substring(0, m.start());

或者:

Pattern p = Pattern.compile("(.*?)" + Pattern.quote(word) + ".*");
Matcher m = p.matcher(sentence);
if (!m.matches())
  throw new IllegalArgumentException("Word not found.");
String before = m.group(1);
于 2012-05-02T20:04:16.550 回答
3

您将需要在单词之前和之后标记句子的每个部分。

http://docs.oracle.com/javase/1.5.0/docs/api/

 String[] result = "this is a test".split("\\s"); //replace \\s with your word
 for (int x=0; x<result.length; x++)
     System.out.println(result[x]);
于 2012-05-02T19:57:22.397 回答
2

试试这个:

import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class Test {
    public static void main(String[] args) {
        Pattern p = Pattern.compile("^.*?(?= word)");
        Matcher m = p.matcher("Everything before the word");
        while (m.find()) {
            System.out.println(m.group());
        }
    }
}

它分解如下:

.*? 一切

(?= 之前

单词

) 结尾

于 2012-05-02T20:06:57.977 回答
0

原因是这+是一个贪婪的量词,它将匹配整个字符串,包括您指定的单词,而不返回。

如果您将其更改为(\\w+?) word它应该可以工作(不情愿的量词)。更多关于量词及其确切功能的信息

于 2012-05-02T20:02:56.270 回答