Java 如何在使用正则表达式时保留分隔符?

Java 如何在使用正则表达式时保留分隔符?,java,regex,separator,punctuation,Java,Regex,Separator,Punctuation,我问了一个关于标点符号和正则表达式的问题,但它令人困惑 既然我有这段文字: String text = "wor.d1, :word2. wo,rd3? word4!"; 我正在这样做: String parts[] = text.split(" "); 我有这个: wor.d1, | :word2. | wor,d3? | word4!; 我需要做什么才能做到这一点?(将符号保留在边框处,但仅限于我指定的:,!?:,而不是全部) 更新 我用这些正则表达式得到了一些很好的结果,但它在一

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

既然我有这段文字:

String text = "wor.d1, :word2. wo,rd3? word4!"; 
我正在这样做:

String parts[] = text.split(" ");
我有这个:

wor.d1, | :word2. | wor,d3? | word4!;
我需要做什么才能做到这一点?(将符号保留在边框处,但仅限于我指定的:
,!?:
,而不是全部)


更新 我用这些正则表达式得到了一些很好的结果,但它在一个单词开头的标点符号上的所有拆分之前给出了一个空字符

有一种方法可以在开始时不使用此空字符?

public static final String PUNCTUATION_SEPARATOR =
        "("
        + "("
        + "(?=^[\"'!?.,;:(){}\\[\\]]+)"
        + "|"
        + "(?<=^[\"'!?.,;:(){}\\[\\]]+)"
        + ")"
        + "|"
        + "("
        + "(?=[\"'!?.,;:(){}\\[\\]]+($|\n))"
        + "|"
        + "(?<=[\"'!?.,;:(){}\\[\\]]+($|\n))"
        + ")"
        + ")";
这个正则表达式是好的,还是有更简单的方法?

public static final String PUNCTUATION_SEPARATOR =
        "("
        + "("
        + "(?=^[\"'!?.,;:(){}\\[\\]]+)"
        + "|"
        + "(?<=^[\"'!?.,;:(){}\\[\\]]+)"
        + ")"
        + "|"
        + "("
        + "(?=[\"'!?.,;:(){}\\[\\]]+($|\n))"
        + "|"
        + "(?<=[\"'!?.,;:(){}\\[\\]]+($|\n))"
        + ")"
        + ")";
公共静态最终字符串标点符号\u分隔符=
"("
+ "("
+ "(?=^[\"'!?.,;:(){}\\[\\]]+)"
+ "|"

+(?我认为您需要。首先分解字符串,第二步使用内爆函数。

您确定要使用正则表达式吗? 通过单个字符进行拆分有一个更快的实现: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...
}

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

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

下面是一个我认为会起作用的正则表达式:

/\s|(?=[\.,:?!](\W|$))|(?<=\W[\.:?!])/
/\s |(?=[\,:?!](\W |$)|(?
公共静态最终字符串标点符号\u分隔符)=
"("
+ "("
+ "(?=^[\"'!?.,;:(){}\\[\\]-]+)"
+ "|"

+(?)看这个问题:这是有效的,但是需要正则表达式或更复杂的东西,因为我只想在边界(开始和结束)而不是在中间吐唾沫。我的意思是,如果符号在字符串的中间(A,B,20.50),我不想分裂,只有在边界(测试,100,等等)。
public static final String PUNCTUATION_SEPARATOR =
    "("
    + "("
    + "(?=^[\"'!?.,;:(){}\\[\\]-]+)"
    + "|"
    + "(?<=^[\"'!?.,;:(){}\\[\\]-]+)"
    + ")"
    + "|"
    + "("
    + "(?=[\"'!?.,;:(){}\\[\\]-]+($|\n))"
    + "|"
    + "(?<=[\"'!?.,;:(){}\\[\\]-]+($|\n))"
    + ")"
    + ")";