匹配字符串中最后一个单词

时间:2015-04-12 08:55:10

标签: java regex string replace

目前,我正在java swing中实现一个文本框,它突出显示了关键字。我引用了this question中给出的第二个答案。但是,我只希望突出显示该单词的最后一次出现。

例如,当用户输入"I have swimming at school at 7pm"时,我希望文本框仅突出显示第二个"at"。我试过在正则表达式中使用负向前瞻。但它没有用。

我使用(at(?!.at)|from|by)))代替(at|from|by)

我尝试过的(参考提供的链接):

  if (wordR == after || String.valueOf(text.charAt(wordR)).matches("\\W")) {
                    if (text.substring(wordL, wordR).matches("(\\W)*(at(?!.at)|from|by)"))
                        setCharacterAttributes(wordL, wordR - wordL, attr, false);
                    else
                        setCharacterAttributes(wordL, wordR - wordL, attrBlack, false);
                    wordL = wordR;
                }

我认为当用户输入时正在进行检查时正则表达式无效,但我不确定如何解决此问题。

3 个答案:

答案 0 :(得分:1)

为什么不使用this method

public int lastIndexOf(String str)
     

返回指定子字符串最后一次出现的字符串中的索引,搜索   从指定的索引开始向后。

如:

System.out.println("index =  " + "I have swimming at school at 7pm".lastIndexOf("at"));

您可以使用lastIndexOf()返回的值来设置String组件中Swing的属性,但很明显,您需要重置以前的内容如下所述:Resetting attributes in a Document after inserting a String

如果您不这样做,该单词的每次出现都将保持突出显示。

答案 1 :(得分:0)

你必须使用正则表达式吗? indexOf有一个起始位置作为从哪里开始搜索的第二个参数。你可以用第一个命中的位置填充它。示例脚本:

String haystack = "I have swimming at school at 7pm";
String needle = " at ";
int pos2 = haystack.indexOf(needle, haystack.indexOf(needle) + 1);
if (pos2 > -1) {
    System.out.println("Found second '" + needle + "' at position " + pos2);
} else {
    System.out.println("Could not find second '" + needle + '"');
}

输出:Found second ' at ' at position 25

如果您还要点击at.at,at?at!,此过程会变得有点复杂,但基本原则保持不变。

答案 2 :(得分:0)

基本上你可以在搜索词之前使用贪心量词:

Pattern p = Pattern.compile(".*\\b(at|from|by)\\b");
String s = "I have swimming at school at 7pm";
Matcher m = p.matcher(s);
if (m.lookingAt()) {
    System.out.println(m.group(1));
}

因为.*是贪婪的,所以你获得了最后一次出现(或者是字符串末尾的第一次出现)。

这种方式的主要兴趣在于它继续在你搜索的单词之前或之后的任何字符上工作,如标点字符,因为交替被字边界包围。例如,当at包含在另一个单词中时,单词边界可以避免误报。

注意:在替换上下文中,您需要捕获字符串的开头。