7

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

假设我有这个文本:

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

我正在这样做:

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

我有这个:

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

我需要做什么才能拥有这个?(将符号保留在边界处,但仅我指定:.,!?:,而不是全部)。

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

更新

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

有没有办法在一开始就没有这个空字符?

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

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

5 回答 5

2

您确定要使用正则表达式吗?有一个更快的单字符分割实现: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...
}
于 2011-08-19T21:14:19.203 回答
1

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

String s  = "one,two, three   four ,  five";
s = s.replaceAll("([,\\s]+)", "#$1#");
Pattern p = Pattern.compile("#");
String[] result = p.split(s);
于 2011-08-19T21:19:47.700 回答
1

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

/\s|(?=[\.,:?!](\W|$))|(?<=\W[\.:?!])/
于 2011-08-19T22:31:18.667 回答
0

在我看来,你想要这个。首先你爆炸你的字符串,第二步你使用 implode 函数。

于 2011-08-19T21:05:31.763 回答
0
public static final String PUNCTUATION_SEPARATOR =
    "("
    + "("
    + "(?=^[\"'!?.,;:(){}\\[\\]-]+)"
    + "|"
    + "(?<=^[\"'!?.,;:(){}\\[\\]-]+)"
    + ")"
    + "|"
    + "("
    + "(?=[\"'!?.,;:(){}\\[\\]-]+($|\n))"
    + "|"
    + "(?<=[\"'!?.,;:(){}\\[\\]-]+($|\n))"
    + ")"
    + ")";
于 2011-08-23T06:31:28.803 回答