2

かなり単純なことをしようとしています。

このようなテキストを取る

ユーザー名: これは私が作成しているコメントです

それは単一の TextView にあります。ユーザー名をリンクにしたい。ユーザー名を「$@」のようなもので囲むのが最も簡単だと判断したので、

"$@User Name:$@ これは私が書いているコメントです

そうすれば、次の正規表現を使用できます

Pattern userName = Pattern.compile(".*\\$@(.+)\\$@.*");

Linkifyでリンクさせます。ただし、明らかに区切り記号を削除する必要があるため、次のコードは

title.setText(titleText);
Linkify.TransformFilter transformer = new Linkify.TransformFilter() {

    @Override
    public String transformUrl(Matcher match, String url) {
       return match.group(1);
    }
};
Linkify.addLinks(title, userName, "content://user=", null,     transformer);

しかし、何らかの理由で、テキスト全体が 1 つの巨大なリンクになり、テキストはまったく変換されません。

4

3 に答える 3

1

実際、それはかなり簡単であることが判明しました。ユーザー名を区切るために狂った「$ @」を使用せず、代わりに

ユーザー名: これは私が作成しているコメントです

だから私は次のパターンを使用することになった

Pattern userName = Pattern.compile("(.+:)");

非常にシンプルで、コードは

title.setText(titleText);
Linkify.addLinks(title, GlobalUtil.userName, "user://" + userId + "/");

元の提案をしてくれたnilに感謝します。リンクである userName だけでなく、文字列全体を実際に一致させていました。

于 2011-06-22T18:47:12.193 に答える
0

私の最善の推測では、使用している正規表現が問題であり、探しているものの前後のすべてを含め、一致する場合は基本的に文字列全体を選択するように指示しています。そのため、TransformFilter一致した文字列全体が渡されている可能性があります。 transformUrl私が知る限り、URL が返されることを期待しているため、文字列全体が最初の一致グループにリンクされています。

したがって、それを念頭に置いて、文字列全体の一致を回避し、単に選択することを回避するために、正規表現を次の行に沿ったものに変更することがおそらく最善の方法です(一致を貪欲にしないようにするためにグループに"\\$@(.+?)\\$@"追加されます)。 ?URL 化したい部分 (より適切な用語がないことと、単語に -ize を追加することはクールに聞こえます)。

于 2011-06-20T23:38:18.560 に答える
0

パターン内に区切り文字を入れて変更しないのはなぜですか?

Pattern userName = Pattern.compile(".*(\\$@.+\\$@).*");

次に、変換フィルターを変更して、URL に変更するときに開始パターンと終了パターンを削除します...

于 2011-06-20T23:54:39.083 に答える