1

我正在寻找正则表达式模式,而不是 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 可以去掉最后一个字符。)

我应该在模式中放入什么正则表达式?

4

6 回答 6

3

您可以使用前瞻断言。例如匹配没有句点的句子:

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

[\w]+(?=\.)  

仅用于最后一个单词(“。”之前的单词)

于 2013-09-12T10:35:06.817 回答
2

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

\w+(?=(\.))

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

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

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

或者,如果您还想包括 ,!;: 等,那么

\w+(?=(\p{Punct}?$))
于 2013-09-12T10:36:25.373 回答
1

您可以使用matcher.group(1)获取第一个捕获组的内容((\w+)在您的情况下)。多说一点,matcher.group(0)会给你完整的比赛。所以你的正则表达式几乎是正确的。改进与您对 的使用有关$,这将赶上行尾。仅当您的句子完全填满时才使用它!

于 2013-09-12T10:33:10.103 回答
0

通过使用 $ 运算符,您只会在行尾获得匹配项。因此,如果您在一行中有多个句子,您将不会在中间找到匹配项。

所以你应该只使用:

(\w+)\.

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

你可以在这里看到一个例子

于 2013-09-12T10:32:22.287 回答
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)。然后最后一句话就是我所追求的。太简单了,真的,我试图排除标点符号,但我猜正则表达式会自动为你做到这一点..?

于 2013-09-12T10:39:35.567 回答
0

使用此正则表达式(\w+)\p{Punct},您将获得 1 组计数,这意味着您将获得一组带有标点符号 atmatcher.group(0)和一组没有标点符号 at matcher.group(1)

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

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

于 2013-09-12T10:43:33.060 回答