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

私の意見では、これが必要です。最初に文字列を分解し、2番目のステップでimplode関数を使用します。

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