Linkify with RegExp, link words not working

59 views Asked by At

I want to apply this RegExp /([^\s])+/g to a TextView with Linkify to make each word clickable.

I tested on http://regexr.com/ that the expression works as I need but when I apply to a Linkify sentence nothing is clickable.

I try to do a simple String.split(regExp) and I receive an only item with the whole String.

What I am doing wrong?

Simple Test

TextView t = (TextView)findViewById(R.id.aa);
t.setText("Con cien cañones por banda, viento en popa a toda vela, no corta el mar, sino vuela, un velero bergantín: bajel pirata que llaman por su bravura el Temido, en todo mar conocido del uno al otro confín. La luna en el mar riela, en la lona gime el viento, y alza en blando movimiento olas de plata y azul; y ve el capitán pirata, cantando alegre en la popa, Asia a un lado, al otro Europa y allá a su frente Stambul. «Navega, velero mío, sin temor, que ni enemigo navío, ni tormenta, ni bonanza, tu rumbo a torcer alcanza, ni a sujetar tu valor. «Veinte presas hemos hecho a despecho del inglés, y han rendido sus pendones cien naciones a mis pies. «¿Qué es mi barco? Mi tesoro. ¿Qué es mi Dios? La libertad. ¿Mi ley? ¡La fuerza y el viento! ¿Mi única patria? ¡La mar! «Allá muevan feroz guerra ciegos reyes por un palmo más de tierra: que yo tengo aquí por mío cuanto abarca el mar bravío, a quien nadie impuso leyes. «Y no hay playa sea cual quiera, ni bandera de esplendor, que no sienta mi derecho y dé pecho a mi valor. «¿Qué es mi barco? Mi tesoro. ¿Qué es mi Dios? La libertad. ¿Mi ley? ¡La fuerza y el viento! ¿Mi única patria? ¡La mar! «A la voz de «¡barco viene!» Es de ver cómo vira y se previene a todo trapo a escapar: que yo soy el rey del mar, y mi furia es de temer. «En las presas yo divido lo cogido por igual: sólo quiero por riqueza la belleza sin rival. «¿Qué es mi barco? Mi tesoro. ¿Qué es mi Dios? La libertad. ¿Mi ley? ¡La fuerza y el viento! ¿Mi única patria? ¡La mar! «¡Sentenciado estoy a muerte! Yo me río: no me abandone la suerte, y al mismo que me condena, colgaré de alguna antena, quizá en su propio navío. «Y si caigo, ¿qué es la vida? Por perdida ya la di cuando el yugo del esclavo, como un bravo, sacudí. «¿Qué es mi barco? Mi tesoro. ¿Qué es mi Dios? La libertad. ¿Mi ley? ¡La fuerza y el viento! ¿Mi única patria? ¡La mar! «Son mi música mejor aquilones; el estrépito y temblor de los cables sacudidos, del negro mar los bramidos y el rugir de mis cañones. «Y del trueno al son violento, y del viento al rebramar, yo me duermo sosegado. Arrullado por el mar. «¿Qué es mi barco? Mi tesoro. ¿Qué es mi Dios? La libertad. ¿Mi ley? ¡La fuerza y el viento! ¿Mi única patria? ¡La mar!");
String[] ss = t.getText().toString().split("/([^\\s])+/g");

Linkify Code

    ...
    TextView t = (TextView)findViewById(R.id.aa);
    t.setText("Con cien cañones por banda, viento en popa a toda vela, no corta el mar, sino vuela, un velero bergantín: bajel pirata que llaman por su bravura el Temido, en todo mar conocido del uno al otro confín. La luna en el mar riela, en la lona gime el viento, y alza en blando movimiento olas de plata y azul; y ve el capitán pirata, cantando alegre en la popa, Asia a un lado, al otro Europa y allá a su frente Stambul. «Navega, velero mío, sin temor, que ni enemigo navío, ni tormenta, ni bonanza, tu rumbo a torcer alcanza, ni a sujetar tu valor. «Veinte presas hemos hecho a despecho del inglés, y han rendido sus pendones cien naciones a mis pies. «¿Qué es mi barco? Mi tesoro. ¿Qué es mi Dios? La libertad. ¿Mi ley? ¡La fuerza y el viento! ¿Mi única patria? ¡La mar! «Allá muevan feroz guerra ciegos reyes por un palmo más de tierra: que yo tengo aquí por mío cuanto abarca el mar bravío, a quien nadie impuso leyes. «Y no hay playa sea cual quiera, ni bandera de esplendor, que no sienta mi derecho y dé pecho a mi valor. «¿Qué es mi barco? Mi tesoro. ¿Qué es mi Dios? La libertad. ¿Mi ley? ¡La fuerza y el viento! ¿Mi única patria? ¡La mar! «A la voz de «¡barco viene!» Es de ver cómo vira y se previene a todo trapo a escapar: que yo soy el rey del mar, y mi furia es de temer. «En las presas yo divido lo cogido por igual: sólo quiero por riqueza la belleza sin rival. «¿Qué es mi barco? Mi tesoro. ¿Qué es mi Dios? La libertad. ¿Mi ley? ¡La fuerza y el viento! ¿Mi única patria? ¡La mar! «¡Sentenciado estoy a muerte! Yo me río: no me abandone la suerte, y al mismo que me condena, colgaré de alguna antena, quizá en su propio navío. «Y si caigo, ¿qué es la vida? Por perdida ya la di cuando el yugo del esclavo, como un bravo, sacudí. «¿Qué es mi barco? Mi tesoro. ¿Qué es mi Dios? La libertad. ¿Mi ley? ¡La fuerza y el viento! ¿Mi única patria? ¡La mar! «Son mi música mejor aquilones; el estrépito y temblor de los cables sacudidos, del negro mar los bramidos y el rugir de mis cañones. «Y del trueno al son violento, y del viento al rebramar, yo me duermo sosegado. Arrullado por el mar. «¿Qué es mi barco? Mi tesoro. ¿Qué es mi Dios? La libertad. ¿Mi ley? ¡La fuerza y el viento! ¿Mi única patria? ¡La mar!");
    addLink(t, "/([^\\s])+/g","http://google.com");
}

/**
* Add a link to the TextView which is given.
*
* @param textView the field containing the text
* @param patternToMatch a regex pattern to put a link around
* @param link the link to add
*/
public static void addLink(TextView textView, String patternToMatch,
                       final String link) {
Linkify.TransformFilter filter = new Linkify.TransformFilter() {
    @Override public String transformUrl(Matcher match, String url) {
        return link;
    }
};
Linkify.addLinks(textView, Pattern.compile(patternToMatch), null, null,
        filter);
}
1

There are 1 answers

0
Eric Leibenguth On

In Java you don't have to use the JS syntax to define a regular expression.

Replace .split("/([^\\s])+/g"); by .split("([^\\s])+");, and similarly in Linkify.

Also note that [^\s] is equivalent to \S, so I think you could simplify the regex down to \S+ (also assuming you don't need the capturing group).