标点符号上的正则表达式

2022-09-01 09:24:03

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

我可以将整个单词与任何标点符号匹配,但匹配器只是为我提供该单词的索引。换句话说:

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());

结果 --> 字符串匹配 ~ “天!

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

我可能会做一些大小写,并用于我可能得到的每种标点符号,但我希望我在使用正则表达式时有一些错误。String.substring(...)


答案 1

Java确实以迂回的方式支持POSIX字符类。对于标点符号,Java 相当于 [:p unct:]\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());
        }
    }
}

答案 2

我会尝试一个类似于

"[.!?\\-]"

在 s 中添加要匹配的任何字符。请注意对正则表达式分析器可能具有特殊含义的任何字符进行转义。[]

然后,您必须通过使用 循环访问匹配项,直到它返回 false。Matcher.find()