1

ユーザーが正規表現を使用してテキストを検索できるプログラムを実行していますが、一致するテキストを選択させたいと考えています。だから私はこのコードを使用します:

    public void onClick(View v) {
        try {
            switch (v.getId()) {
                case R.id.btn_search:
                    Matcher m = Pattern.compile(reg.getText().toString()).matcher(txt.getText());
                    int start = txt.getSelectionStart();
                    if (start != txt.getSelectionEnd()) {
                        start++;
                    }
                    if (start < 0 || start >= txt.length()) {
                        start = 0;
                    }
                    while (true) {
                        try {
                            m.find(start);
                            txt.setSelection(m.start(), m.end());
                            txt.requestFocus();
                            break;
                        } catch (IllegalStateException ex) {
                            if (start == 0) {
                                err_notfound.show();
                                break;
                            }
                            start = 0;
                        }
                    }
                    break;
            }
        } catch (PatternSyntaxException ex) {
            err_syntax.show();
        } catch (Throwable ex) {
            showException("onClick", ex);
        }
    }

ただし、コードは期待どおりに機能していません。カーソルを手動である位置に置いてから検索ボタンを押すと、プログラムがカーソルをm.start()に設定しても、選択範囲をm.end()に展開しない場合があります。プログラムをテストしましたが、m.start()とm.end()の値が異なります。問題の原因を誰かが知っている場合は、教えてください。感謝します。

編集:助けてくれてありがとう!質問に対する答えを見つけました。これは、カーソルを移動してテキストを選択するために使用されるピンと関係があります(それが何と呼ばれるかはわかりません...)。テキストフィールドに表示されていて、setSelection()が呼び出された場合、EditTextは選択を正しく表示しません。ただし、getSelectionStart()とgetSelectionEnd()を使用すると、これらはm.getStart()とm.getEnd()の値とまったく同じであることがわかります。これはバグである可能性があります。したがって、私の解決策は、最初にclearFocus()を呼び出すことです。変更されたコードは次のようになります。

                    txt.clearFocus();
                    while (true) {
                        try {
                            m.find(start);
                            txt.setSelection(m.start(), m.end());
                            txt.requestFocus();
                            break;
                        } catch (IllegalStateException ex) {
                            if (start == 0) {
                                err_notfound.show();
                                break;
                            }
                            start = 0;
                        }
                    }

そしてそれは動作します。

4

1 に答える 1

1

私はあなたのコードをテストし、1 つの変更を加えました。

 Matcher m = Pattern.compile("1*", Pattern.CASE_INSENSITIVE).matcher(txt.getText()); 

次に、EditText に 1 のみが含まれていることを確認し、全体を強調表示しました。

正規表現が正しく記述されていることを確認する必要があります。正規表現の詳細については、こちらを参照してください(先ほど使用したサイトと同じです)。

于 2012-09-26T13:16:08.220 に答える