Newsgroup: it.comp.java
Titolo: Ricerca parola esatta

Salve,
mi potete indicare un metodo per ricercare una parola esatta in una
stringa?
Ho provato queste 3 soluzioni, ma senza ottenere il risultato voluto:
1- stringa.contains("porta") e stringa.indexOf("porta") prendono in
considerazioni anche le parole che contengono "porta", ad esempio
"portachiavi";
2- se a "porta" aggiungo uno spazio all'inizio ed uno alla fine,
facendolo diventare " porta ", non funziona se questa parola è
l'ultima della stringa;
3- ho provato ad usare qualcosa del tipo stringa.matches("\bporta\b"),
ma mi restituisce sempre false.
buona domenica


Scegli tu:
public class test
  {
   private static boolean contieneStringa(String tutto,String parte)
    {
     return
      (
       tutto.equals(parte)||
       (tutto.indexOf(parte+" ")==0)||
       (tutto.length()==tutto.lastIndexOf(" "+parte)+parte.length()+1)||
       (tutto.indexOf(" "+parte+" ")>=0)
      );
    }
   private static boolean contieneStringa2(String tutto,String parte)
    {
     int n=tutto.indexOf(parte);
     return
      (
       (n>=0)&&
       (
        (n==0)||
        (tutto.charAt(n-1)==' ')
       )&&
       (
        (n+parte.length()==tutto.length())||
        (tutto.charAt(n+parte.length())==' ')
       )
      );
    }
   public static void main(String[]args)
    {
     System.out.println(contieneStringa("abc porta","porta"));
     System.out.println(contieneStringa("porta abc","porta"));
     System.out.println(contieneStringa("abc porta abc","porta"));
     System.out.println(contieneStringa("",""));
     System.out.println(contieneStringa("abc port","porta"));
     System.out.println();
     System.out.println(contieneStringa2("abc porta","porta"));
     System.out.println(contieneStringa2("porta abc","porta"));
     System.out.println(contieneStringa2("abc porta abc","porta"));
     System.out.println(contieneStringa2("",""));
     System.out.println(contieneStringa2("abc port","porta"));
    }
  }

 3- ho provato ad usare qualcosa del tipo stringa.matches("\bporta\b"),
Hai provato anche s.matches(".*\\bporta\\b.*")?
Ciao
   Lucio
-- 
Lucio Benfante       
http://www.lambico.org
JUG Padova           
http://www.parancoe.org
www.jugpadova.it
 
http://www.jugevents.org

 Scegli tu:
[CUT]
Dimenticavo la punteggiatura...
public class test
  {
   private static boolean delimitaStringa(String s,int n)
    {
     if ((n<0)||(n>=s.length()))
      {return true;}
     String delimitatori=" .,;:?!";//inserire qui, a seconda delle 
necessit�, eventuali altri delimitatori
     char c=s.charAt(n);
     for (int i=0;i<delimitatori.length();i++)
      {
       if (delimitatori.charAt(i)==c)
        {return true;}
      }
     return false;
    }
   private static boolean contieneStringa(String tutto,String parte)
    {
     int n=tutto.indexOf(parte);
     return
      (
       (n>=0)&&
       delimitaStringa(tutto,n-1)&&
       delimitaStringa(tutto,n+parte.length())
      );
    }
   public static void main(String[]args)
    {
     System.out.println("match - contieneStringa");
     String s="abc porta";
     System.out.print("s="+s+" :"+s.matches(".*\\bporta\\b.*"));
     System.out.println(" - "+contieneStringa(s,"porta"));
     s="porta abc";
     System.out.print("s="+s+" :"+s.matches(".*\\bporta\\b.*"));
     System.out.println(" - "+contieneStringa(s,"porta"));
     s="portale";
     System.out.print("s="+s+" :"+s.matches(".*\\bporta\\b.*"));
     System.out.println(" - "+contieneStringa(s,"porta"));
     s="abc port";
     System.out.print("s="+s+" :"+s.matches(".*\\bporta\\b.*"));
     System.out.println(" - "+contieneStringa(s,"porta"));
     s="abc porta abc. Abc";
     System.out.print("s="+s+" :"+s.matches(".*\\bporta\\b.*"));
     System.out.println(" - "+contieneStringa(s,"porta"));
     s="";
     System.out.print("s="+s+" :"+s.matches(".*\\b\\b.*"));
     System.out.println(" - "+contieneStringa(s,""));
     s="abc porta abc!!! Abc";
     System.out.print("matches (s="+s+") :"+s.matches(".*\\bporta\\b.*"));
     System.out.println(" - "+contieneStringa(s,"porta"));
    }
  }
N.B. s.matches(".*\\bporta\\b.*") sembra funzionare allo stesso modo, 
tranne quando cerchi "" in ""... ma � un caso abbastanza discutibile...

grazie mille ad entrambi

Comunque, nel frattempo, avevo trovata un'altra possibile soluzione
public boolena contieneParola(){
        ArrayList paroleDaCercare = new ArrayList();
        paroleDaCercare.add("parola1");
        paroleDaCercare.add("parola2");
        boolean c = false;
        String[] parole = riga.split(" ");
        for( int i = 0; i < parole.length; i++ ){
            String p = parole[ i ].trim();
            if( paroleDaCercare.contains( p ) )  c = true;
        }
        return c;
}