标点符号的正则表达式

新手上路,请多包涵

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

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

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

将抓取最后带有 "!" 的任何单词。例如:

 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(...) 来表示我可能得到的每一种标点符号,但我希望我在使用正则表达式来执行此操作时出现一些错误。

原文由 Mister R2 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 1.1k
2 个回答

我会尝试一个类似于

"[.!?\\-]"

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

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

原文由 Code-Apprentice 发布,翻译遵循 CC BY-SA 3.0 许可协议

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

原文由 EdgeCase 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题