正则表达式以句点结尾的句子中的最后一个单词(句点)

时间:2013-09-12 10:25:39

标签: java regex

我正在寻找正则表达式模式,而不是Java代码,以匹配英语(或欧洲语言)句子中的最后一个单词。如果最后一个单词是“hi”,那么我想匹配“hi”而不是“hi”。

正则表达式(\w+)\.$将匹配“hi。”,而输出应该只是“hi”。什么是正确的正则表达式?

thufir@dur:~/NetBeansProjects/regex$ 
thufir@dur:~/NetBeansProjects/regex$ java -jar dist/regex.jar 


trying
a b cd efg hi
matches:
hi


trying
a b cd efg hi.
matches:
thufir@dur:~/NetBeansProjects/regex$ 

代码:

package regex;

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

public class Main {

    public static void main(String[] args) {
        String matchesLastWordFine = "a b cd efg hi";
        lastWord(matchesLastWordFine);
        String noMatchFound = matchesLastWordFine + ".";
        lastWord(noMatchFound);
    }

    private static void lastWord(String sentence) {
        System.out.println("\n\ntrying\n" + sentence + "\nmatches:");
        Pattern pattern = Pattern.compile("(\\w+)$");
        Matcher matcher = pattern.matcher(sentence);
        String match = null;
        while (matcher.find()) {
            match = matcher.group();
            System.out.println(match);
        }
    }
}

我的代码是用Java编写的,但这既不是在这里也不是在那里。我正在严格地寻找正则表达式,而不是Java代码。 (是的,我知道用Java删除最后一个字符是可能的。)

我应该在模式中加入什么样的正则表达式?

6 个答案:

答案 0 :(得分:3)

你可以使用lookahead asserion。例如,匹配没有句号的句子:

[\w\s]+(?=\.)

[\w]+(?=\.)  

最后一句话(“。”之前的字)

答案 1 :(得分:2)

如果您需要将整个匹配作为最后一个词,您可以使用前瞻。

\w+(?=(\.))

这匹配一组后跟句点的单词字符,而不匹配句点。

如果您想要该行中的最后一个单词,无论该行的结尾是否结束,您都可以使用:

\w+(?=(\.?$))

或者,如果您还要包含,!;:等,那么

\w+(?=(\p{Punct}?$))

答案 2 :(得分:1)

您可以使用matcher.group(1)获取第一个捕获组((\w+)的内容)。再说一点,matcher.group(0)会给你全部比赛。所以你的正则表达式几乎是正确的。一个改进与你使用$有关,这将抓住这一行的结尾。只有当你的句子填写完整的行时才使用它!

答案 3 :(得分:0)

通过使用$运算符,您只能在一行结尾处获得匹配。因此,如果你在一行上有多个句子,你就不会在中间的句子中得到匹配。

所以你应该使用:

(\w+)\.

捕获组将给出正确的匹配。

您可以看到示例here

答案 4 :(得分:0)

我真的不明白为什么,但这有效:

package regex;

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

public class Main {

    public static void main(String[] args) {
        String matchesLastWordFine = "a b cd efg hi";
        lastWord(matchesLastWordFine);
        String noMatchFound = matchesLastWordFine + ".";
        lastWord(noMatchFound);
    }

    private static void lastWord(String sentence) {
        System.out.println("\n\ntrying\n" + sentence + "\nmatches:");
        Pattern pattern = Pattern.compile("(\\w+)");  //(\w+)\.
        Matcher matcher = pattern.matcher(sentence);
        String match = null;
        while (matcher.find()) {
            match = matcher.group();
        }
        System.out.println(match);
    }
}

我猜正则表达式\w+将匹配所有单词(doh)。然后最后一个字就是我追求的。太简单了,真的,我试图排除标点符号,但我想正则表达式会自动为你做这个...?

答案 5 :(得分:0)

使用此正则表达式(\w+)\p{Punct},您获得的组计数为1,意味着您在matcher.group(0)获得一个带有功能的组,而在matcher.group(1)获得一个没有标点符号的组。

要在Java中编写正则表达式,请使用:"(\\w+)\\p{Punct}"

要使用Java在线测试正则表达式(实际上还有许多其他语言),请参阅RegexPlanet