3

私はJavaで正規表現を始めたばかりで、本とJavaドキュメントを読んでいます。次のプログラムを考えると、区切り文字として使用した場合"[\\s*]"と同等ではない理由がわかりません。"\\s*"それ"[\\s*]"は同等"\\s+"のようです、誰かが私に論理的にこれがなぜそうなのかを説明できますか?

import java.util.Scanner;
import java.util.regex.Pattern;
public class ScanString {
    public static void main(String[] args) {
        String str = "Smith , where Jones had had 'had', had had 'had had'.";
        String regex = "had";
        System.out.println("String is:\n" + str + "\nToken sought is " + regex);

        Pattern had = Pattern.compile(regex);
        Scanner strScan = new Scanner(str);
        strScan.useDelimiter("\\s*");
        int hadCount = 0;
        while(strScan.hasNext()) {
            if(strScan.hasNext(had)) {
                ++hadCount;
                System.out.println("Token found!: " + strScan.next(had));

            } else {
                System.out.println("Token is    : " + strScan.next());
            }
        }
        System.out.println("Count is: " + hadCount);
    }
}

私にとって意味のある出力は、個別のトークンとしてのすべての非空白文字です。区切り文字を"\\s+"またはに変更する"[\\s*]"と、出力は次のようになります。

String is:
Smith , where Jones had had 'had', had had 'had had'.
Token sought is had
Token is    : Smith
Token is    : ,
Token is    : where
Token is    : Jones
Token found!: had
Token found!: had
Token is    : 'had',
Token found!: had
Token found!: had
Token is    : 'had
Token is    : had'.
Count is: 4

4

2 に答える 2

4

[]かっこは文字クラスを囲みます。それらの中で、特殊文字に関する規則は異なります。唯一の特殊文字は、「閉じ括弧(])、円記号(\)、カレット(^)、およびハイフン(-)」です。(このページから取得)

したがって、この場合[\\s*]は「スペースまたは*」を意味します。

正規表現を扱う場合は、RegexPlanet(コードをテストするため)やRegexper(regexpをグラフィカルに視覚化するため)などのWebサイトを使用できます。

于 2013-03-10T02:34:50.283 に答える
1

[]文字クラスです。これらの例を見てください:は。[abc]を意味しa|b|cます。あなたがそのようなものを作成する場合、それは(または文字)[a*]を意味します。a|\\*a*

于 2013-03-10T02:35:45.360 に答える