Foro de elhacker.net

Programación => Java => Mensaje iniciado por: SrTrp en 10 Febrero 2019, 02:13 am



Título: Matches para palabras o silabas
Publicado por: SrTrp en 10 Febrero 2019, 02:13 am
Bueno quiero usar matches para saber cuando hay silabas o palabras en una cadena
Código
  1. String condicion= ".*[si]+[so].*";
  2.        Pattern pattern = Pattern.compile(condicion);
  3.        Matcher matcher = pattern.matcher(cadena);
  4.         System.out.println(matcher.matches());
  5.  
pero no se como implementart las expresiones para por ejemplo una cadena siso me devuelva true pero si es una cadena sis me devuelva false


Título: Re: Matches para palabras o silabas
Publicado por: rub'n en 10 Febrero 2019, 02:35 am
pero no se como implementart las expresiones para por ejemplo una cadena siso me devuelva true pero si es una cadena sis me devuelva false

Esa parte que siso te de true y sis false? quieres decir?

Hay tienes para empezar la clase Pattern en su docu ayuda mas

Código
  1. private void silabas() {
  2.        final String silabas = "aeiouy";
  3.        final Pattern pattern = Pattern.compile("[aeiyou]+");
  4.        final Matcher matcher = pattern.matcher(silabas);
  5.        System.out.println(matcher.matches());
  6. }
  7.  
  8. private void palabras() {
  9.        final String sis = "sis";
  10.        final String siso = "siso";
  11.        final Pattern pattern = Pattern.compile("[a-zA-Z]+");// falta quitar espacios puntos y comas, con replaceAll("^[.,\\s]+"), voy a dormir XD
  12.        final Matcher matcher = pattern.matcher(sis);
  13.        System.out.println(matcher.matches());  // true con ambos String
  14. }


Título: Re: Matches para palabras o silabas
Publicado por: SrTrp en 10 Febrero 2019, 05:42 am
lo que me refiero con siso que detecta que tiene silabas correctas y que debe dar true por ejemplo si ingreso estas cadenas debe dar true "siso" "como si", y  debe dar false por ejemplo "sis", "metete al sistema"..


Título: Re: Matches para palabras o silabas
Publicado por: rub'n en 10 Febrero 2019, 12:19 pm
lo que me refiero con siso que detecta que tiene silabas correctas y que debe dar true por ejemplo si ingreso estas cadenas debe dar true "siso" "como si", y  debe dar false por ejemplo "sis", "metete al sistema"..

Entonces según entiendo, si la palabra tiene, o contiene sis, dar false(la i es una silaba también XD, mala descripción tuya, o sea, tu no te estas refiriendo si tiene varias silabas, o una silaba), ahí va, sino tocara reimplementar tu descripción

Código
  1. private void negarSis() {
  2.    final String palabra = "siso"; // debe dar true
  3.    final String palabra2 = "como si"; // debe dar true
  4.    final String meteteAlsistema = "metete al SIStema"; // solo "sis" false
  5.    final Pattern pattern = Pattern.compile("^(?i)(?!.*?sis).*");//flag ignore case (?i) metete al SIStema, o metete al sistema, resultado false
  6.    final Matcher matcher = pattern.matcher(meteteAlsistema);
  7.    System.out.println(matcher.matches());
  8. }


Título: Re: Matches para palabras o silabas
Publicado por: SrTrp en 10 Febrero 2019, 19:33 pm
Deja me explico mejor xd por ejemplo la silabas de s serían (sa,se,si,so,su) por lo tanto palabras como "suma,sistema y todo eso entra" y perdón no me explique bien quiero detectar silabas con matches y si esta algo bien como me explicaste pero quiero saber mas de 1 caso de silabas quiero que verifique que una cadena tenga alguna silaba la que sea y cierto sistemas entra en true, lo único que se me ocurre es crear 5 matches con cada una de las silabas y si alguna me devuelve true es que hay, pero quiero hacerlo solo en un matcher como sería la expresión?


Título: Re: Matches para palabras o silabas
Publicado por: SrTrp en 10 Febrero 2019, 20:47 pm
Pues creo ya lo supe la expresión algo así
Código:
".*sa.*|.*se.*|.*si.*|.*so.*|.*su.*"


Título: Re: Matches para palabras o silabas
Publicado por: Serapis en 10 Febrero 2019, 23:43 pm
Es un error común confundir la gramática de un lenguaje de programación con la gramática humana.

En programación, las expresiones regulares reconocen 'patrones'.
Para reconocer sílabas del lenguaje humano, deben crearse los patrones específicos... es decir no están descritas como tal, las sílabas de la gramática humana, tienen reglas, que definen donde termina una sílaba y empieza otra, que además es dependiente del idioma. En español, por ejemplo, tenemos los diptongos, hiatos y triptongos, que pueden complicarlo...

entonces la única forma de reconocer sílbas del español, será crear patrones para cada caso, bien que luego muchos se puedan aunar en uno mismo, con ligeras diferencias o a base de complicarlo... la sílaba más larga en español suelen ser de la forma: "trans".

Con la s, tienes sílabas sa, se si, so, su, pero que las reconozca bien o no, dependerá de la letra que luego venga detrás... así: en "Sor Socorro sospecha del soriano"Las silabas de 's' son:
Sor - espacio
So - corro
sos - pecha
so - riano.

Como puede ves 'sor' de Sor es una sola sílaba, pero luego en soriano las 3 mismas letras 's+o+r' participan de 2 sílabas.

Resumiendo, obtener las sílabas de plabras del lenguaje humano, es algo más complicado... requiere primero aprenderte bien la parte de la gramática española que lo trata (análisis léxicográfico), luego estarás más preparado para ser capaz de exponer patrones que capten las sílabas.

Una forma sucia es componer todas las situaciones posibles para 3 letras con la 's', descartando luego a mano las que no proceden y revisando luego las que tienen casos positivos y negaticos (como ese doble caso de sor y soriano), entonces para estos casos primero filtras encontrarlos todos y luego una segunda revisión que descarte todos los casos...
Posiblemente esta sea la regla para todas las silabas comenzando con 's' (pero no si no es inicial, por ejemplo como en la 's' final de 'no-so-tros')
tomar3 = "s" vocal consonante separador   ejemplo: 'sal ', 'sol ', 'Toma-sín '
tomar3 = "s" vocal consonante consonante    ejemplo: 'sas-tre', 'sím-bolo', 'sal-go', 'sís-tole'
tomar2 = "s" vocal consonante vocal      ejemplo 'sa-lida', 'so-corro', 'se-ta', 'sa-gaz'
tomar2 = "s" vocal vocal     ---> ejemplo 'Sá-ez', 'sa-eta', 'se-ísmo'

tomar2, tomar3 indica que son sílabas de 2 y 3 letras respectivamente.
Pero hay que revisarlo en profundidad, para ver si hay algún caso irregular... y aclaro que solo sería sabiendo que la 's' es comienzo de sílaba, en una palabra como 'es-truendo', tras la 's' le sigue una consonante...

En fin, es tarea tuya, peor ahí tienes por donde cogerlo de un a forma sucia... es válido si sólo precisas hacerlo para la 's', si pretendes hacerlo con todo el alfabeto, entonces es mejor que te estudies a fondo la gramática española para recrear las reglas de formación de sílabas y poderlo portar para programarlo.