我正在寻找正则表达式模式,而不是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删除最后一个字符是可能的。)
我应该在模式中加入什么样的正则表达式?
答案 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)
答案 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