30

したがって、私は正規表現がまったく初めてで、Java を使用java.util.regexして入力文字列の句読点を見つけようとしています。(1) !, ?, ., ... はすべて有効な句読点であり、(2) 「<」と「>」は何か特別な意味を持ち、句読点としてカウントしないでください。プログラム自体が疑似ランダムにフレーズを作成するので、ランダム プロセスを実行する前に文末の句読点を削除したいと考えています。

任意の句読点を使用して単語全体を一致させることができますが、マッチャーはその単語のインデックスを提供するだけです。言い換えると:

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

末尾に a がある単語を取得します"!"。例えば:

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());

結果は --> 文字列一致 ~ "day!" になります。

Matcherしかし、私はインデックスだけを持ちたい"!"ので、それを分割することができます。

おそらくケースを作成し、String.substring(...)取得する可能性のある句読点の種類ごとに使用できますが、これを行うための正規表現の使用に間違いがあることを願っています.

4

3 に答える 3

44

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());
        }
    }
}
于 2012-07-28T23:12:39.373 に答える
26

次のような文字クラスの正規表現を試します

"[.!?\\-]"

s の中に一致させたい任意の文字を追加します[]。正規表現パーサーにとって特別な意味を持つ可能性のある文字をエスケープするように注意してください。

Matcher.find()次に、 false が返されるまでを使用して、一致を繰り返す必要があります。

于 2012-07-28T22:24:12.937 に答える