-2

ここでは、一致する最初の 15 文字をキャッチするために正規表現を使用しています。部分文字列を使用している間は (0,matcher.start()) のみを使用する必要があり、15 文字のみを取得する必要があります。親切に助けてください。

   String test = "hello world this is example";
        Pattern p = Pattern.compile(".{15}");

    //can't change the code below
    //can only make changes to pattern 


        Matcher m=p.matches(test);
        matcher.find(){
            String string = test.substring(0, m.start());
        }

    //here it is escaping the first 15 characters but I need them
    //the m.start() here is giving 0 but it should give 15
4

2 に答える 2

0

可能であれば、@jlordo のコメントに同意します:String string = test.substring(0, 15);

変更不可としてマークした一番下のコード スニペットを通過せざるを得ない場合は、回避策があります。(それは場合によって異なります...変更不可能なコードスニペットに固執している場合、コンパイルさえできません...あなたは悪い時間を過ごすことになります)

常に 15 を返す正規表現が本当に必要な場合は、正規表現の後読みの概念m.start()を使用できます。

        String test = "hello world this is example";
        Pattern p = Pattern.compile("(?<=.{15}).");

        Matcher m=p.matcher(test);
        m.find();
        System.out.println(m.start());

入力test文字列の長さが 16 文字以上であれば、これは常に 15 を返しm.start()ます。正規表現は、「任意の文字 (最後の .) の前に (?<=) 後読み演算子) ちょうど 15 個の任意の文字 (.{15})」として読み取られることになっています。

(?<=foo)後ろに来る正規表現の前に「foo」を付ける必要があることを指定する後読み演算子です。正規表現の例: 次(?<=foo)bar
のバーには一致しますが、次のバーには一致しfoobar
ません:wunderbar

于 2013-01-15T16:00:17.707 に答える
0

Matcher.start() の代わりに Matcher.end() を使用する必要があります。

String test = "hello world this is example";
            Pattern p = Pattern.compile(".{15}");
            Matcher m=p.matcher(test);
            if(m.find()){
                String string = test.substring(0, m.end());
                System.out.println(string);
            }       

API から:

  1. Matcher.start() ---> 前の一致の開始インデックスを返します。
  2. Matcher.end() ---> 一致した最後の文字の後のオフセットを返します。
于 2013-01-15T15:14:34.827 に答える