如何在使用RegEx时保留分隔符?

时间:2011-08-19 21:01:58

标签: java regex separator punctuation

我做了一个关于标点符号和正则表达式的问题,但这很令人困惑。

Supossing我有这样的文字:

String text = "wor.d1, :word2. wo,rd3? word4!"; 

我这样做:

String parts[] = text.split(" ");

我有这个:

wor.d1, | :word2. | wor,d3? | word4!;

我需要做些什么?(将符号保留在边框处,但仅限于我指定的位置:.,!?:,而不是全部。

wor,d1 | , | : | word2 | . | wor,d3 | ? | word4 | !

更新

我正在使用这些正则表达式获得一些好的结果,但它在一个单词开头的标点符号的所有分割之前给出一个空的char。

有一种方法可以在开始时没有这个空的字符吗?

这个正则表达式是好还是有更简单的方法?

public static final String PUNCTUATION_SEPARATOR =
        "("
        + "("
        + "(?=^[\"'!?.,;:(){}\\[\\]]+)"
        + "|"
        + "(?<=^[\"'!?.,;:(){}\\[\\]]+)"
        + ")"
        + "|"
        + "("
        + "(?=[\"'!?.,;:(){}\\[\\]]+($|\n))"
        + "|"
        + "(?<=[\"'!?.,;:(){}\\[\\]]+($|\n))"
        + ")"
        + ")";

5 个答案:

答案 0 :(得分:2)

您确定要使用正则表达式吗? 通过单个char:StringTokenizer进行拆分的实现更快。 它可以返回分隔符。

String str= "word1, word2. word3? word4!";
String delim = ",.!?";
StringTokenizer st = new StringTokenizer(str, delim, true);
while (st.hasMoreTokens()) {
  String token = st.nextToken();
  ... // token will be: "word1", ",", " word2", ".", etc...
}

答案 1 :(得分:1)

对于简单的分隔符,我推荐使用StringTokenizer。但这是使用正则表达式和另一个辅助分隔符的解决方案:

String s  = "one,two, three   four ,  five";
s = s.replaceAll("([,\\s]+)", "#$1#");
Pattern p = Pattern.compile("#");
String[] result = p.split(s);

答案 2 :(得分:1)

这是我认为可行的正则表达式:

/\s|(?=[\.,:?!](\W|$))|(?<=\W[\.:?!])/

答案 3 :(得分:0)

在我看来,你想要this。首先你爆炸你的弦,第二步你使用内爆函数。

答案 4 :(得分:0)

public static final String PUNCTUATION_SEPARATOR =
    "("
    + "("
    + "(?=^[\"'!?.,;:(){}\\[\\]-]+)"
    + "|"
    + "(?<=^[\"'!?.,;:(){}\\[\\]-]+)"
    + ")"
    + "|"
    + "("
    + "(?=[\"'!?.,;:(){}\\[\\]-]+($|\n))"
    + "|"
    + "(?<=[\"'!?.,;:(){}\\[\\]-]+($|\n))"
    + ")"
    + ")";