关于标点符号的正则表达式

Mis*_* R2 14 java regex string

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

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

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

会抓住最后一个字"!".例如:

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());
Run Code Online (Sandbox Code Playgroud)

结果 - >字符串匹配〜"天!"

但是我想要Matcher索引"!",所以我可以把它分开.

我可以制作案例,并使用String.substring(...)我可能得到的每种标点符号,但我希望我使用正则表达式来做这件事有些错误.

Edg*_*ase 29

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());
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 使用`\ pP`要好得多. (6认同)
  • 与上面相同的问题,使用`Matcher.find()`.请注意,在返回所有匹配项时,(内存)性能要好得多.如果你只想匹配一个完整的字符串,你也可以编写`"input".matches("pattern")`顺便说一下. (2认同)

Cod*_*ice 7

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

"[.!?\\-]"
Run Code Online (Sandbox Code Playgroud)

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

然后,您必须使用迭代迭代匹配,Matcher.find()直到它返回false.

  • 提示:[这里](http://www.regular-expressions.info/charclass.html)您可以阅读*字符类中的特殊字符或元字符是右括号(]),反斜杠(\),尖号(^)和连字符(-)*。通常的元字符是字符类中的普通字符。所以`“ [\\。\\!\\ ??”“`与`” [。!?]“` (3认同)
  • @Pshemo:虽然您忘了在评论中转义反斜杠字符:) (2认同)