30

所以我对正则表达式完全陌生,我正在尝试使用 Javajava.util.regex在输入字符串中查找标点符号。我不知道我可能会提前得到什么样的标点符号,除了 (1) !, ?, ., ... 都是有效的标点符号,以及 (2) "<" 和 ">" 意味着一些特殊的东西,并且不要算作标点符号。程序本身会伪随机地构建短语,我想在它通过随机过程之前去掉句子末尾的标点符号。

我可以用任何标点符号匹配整个单词,但匹配器只给我那个单词的索引。换句话说:

Pattern p = Pattern.compile("(.*\\!)*?");
Matcher m = p.matcher([some input string]);

将抓住任何以 a"!"结尾的单词。例如:

String inputString = "It is a warm Summer day!";
Pattern p = Pattern.compile("(.*\\!)*?");
Matcher m = p.matcher(inputString);
String match = inputString.substring(m.start(), m.end());

结果 --> 字符串匹配 ~ "day!"

但我只想有Matcher索引"!",所以我可以把它分开。

我可能会提出案例,并使用String.substring(...)我可能得到的每种标点符号,但我希望我在使用正则表达式时会出现一些错误。

4

3 回答 3

44

Java 确实以迂回的方式支持 POSIX 字符类。对于标点符号,[:punct:]的 Java 等价物是\p{Punct}

详情请参阅以下链接

这是一个使用评论中的表达式的具体工作示例

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

public class RegexFindPunctuation {

    public static void main(String[] args) {
        Pattern p = Pattern.compile("\\p{Punct}");

        Matcher m = p.matcher("One day! when I was walking. I found your pants? just kidding...");
        int count = 0;
        while (m.find()) {
            count++;
            System.out.println("\nMatch number: " + count);
            System.out.println("start() : " + m.start());
            System.out.println("end()   : " + m.end());
            System.out.println("group() : " + m.group());
        }
    }
}
于 2012-07-28T23:12:39.373 回答
26

我会尝试类似的字符类正则表达式

"[.!?\\-]"

[]在s中添加您希望匹配的任何字符。小心转义任何可能对正则表达式解析器具有特殊含义的字符。

然后,您必须使用 using 遍历匹配项,Matcher.find()直到它返回 false。

于 2012-07-28T22:24:12.937 回答
1

我会尝试

\W

它匹配任何非单词字符。这包括空格和标点符号,但不包括下划线。相当于 [^A-Za-z0-9_]

于 2020-01-11T13:29:14.563 回答