2014-05-18 20 views
5

Hy,Rimozione parole duplicati consecutivi di testo utilizzando Regex e la visualizzazione del nuovo testo

ho il seguente codice:

import java.io.*; 
import java.util.ArrayList; 
import java.util.Scanner; 
import java.util.regex.*; 

/
public class RegexSimple4 
{ 

    public static void main(String[] args) { 

      try 
      { 
     Scanner myfis = new Scanner(new File("D:\\myfis32.txt")); 
      ArrayList <String> foundaz = new ArrayList<String>(); 
      ArrayList <String> noduplicates = new ArrayList<String>(); 

     while(myfis.hasNext()) 
     { 
      String line = myfis.nextLine(); 
      String delim = " "; 
      String [] words = line.split(delim); 



    for (String s : words) {      
        if (!s.isEmpty() && s != null) 
        { 
         Pattern pi = Pattern.compile("[aA-zZ]*"); 
         Matcher ma = pi.matcher(s); 

         if (ma.find()) { 
          foundaz.add(s); 
         } 
        } 
       } 
      } 
        if(foundaz.isEmpty()) 
       { 
        System.out.println("No words have been found"); 
       } 

        if(!foundaz.isEmpty()) 
        { 
         int n = foundaz.size(); 
         String plus = foundaz.get(0); 
         noduplicates.add(plus); 
         for(int i=1; i<n; i++) 
         { 
          if(!noduplicates.get(i-1).equalsIgnoreCase(foundaz.get(i))) 
          { 
          noduplicates.add(foundaz.get(i)); 
          } 
         } 
         //System.out.print("Cuvantul/cuvintele \n"+i); 

       } 
        if(!foundaz.isEmpty()) 
        { System.out.print("Original text \n"); 
         for(String s: foundaz) 
         { 
          System.out.println(s); 
       } 
         } 
        if(!noduplicates.isEmpty()) 
        { System.out.print("Remove duplicates\n"); 
         for(String s: noduplicates) 
         { 
          System.out.println(s); 
       } 
         } 

     } 


catch(Exception ex) 
    { 
     System.out.println(ex); 
    } 
} 
} 

Con lo scopo di rimuovere i duplicati consecutivi da frasi. Il codice funziona solo per una colonna di stringhe non per frasi a lunghezza intera.

Per esempio il mio ingresso dovrebbe essere:

bla bla topi cane gatto. Gatto cane cane topi.

E i topi Blah cane gatto uscita

. Cane topi gatto.

Sincerly,

risposta

19

Prima di tutto, la regex [aA-zZ]* non fa quello che pensi lo fa. Significa "Corrispondenza zero o più a s o caratteri nell'intervallo compreso tra ASCII A e ASCII z (che include anche [, ], \ e altri) o Z s". Pertanto corrisponde anche alla stringa vuota.

Supponendo che si sta solo alla ricerca di parole duplicati che si compone esclusivamente di lettere ASCII, caso-insensibilmente, mantenendo la prima parola (che significa che non si vuole abbinare "it's it's" o "olé olé!"), allora si può fare che nel una singola operazione regex:

String result = subject.replaceAll("(?i)\\b([a-z]+)\\b(?:\\s+\\1\\b)+", "$1"); 

che cambierà

Hello hello Hello there there past pastures 

in

Hello there past pastures 

Spiegazione:

(?i)  # Mode: case-insensitive 
\b  # Match the start of a word 
([a-z]+) # Match one ASCII "word", capture it in group 1 
\b  # Match the end of a word 
(?:  # Start of non-capturing group: 
\s+  # Match at least one whitespace character 
\1  # Match the same word as captured before (case-insensitively) 
\b  # and make sure it ends there. 
)+  # Repeat that as often as possible 

Guardalo live on regex101.com.

+0

Ma come io uso il tuo regex nel mio programma. Ho un file come input e vorrei visualizzare il suo contenuto senza ridondanza usando System.out.print. Grazie :-) – SocketM

+0

Grazie mille, ma cosa significa $ 1 :-)? – SocketM

+0

@SocketM: Quella è una variabile speciale che fa riferimento al contenuto del primo [gruppo di acquisizione] (http://www.regular-expressions.info/brackets.html), in questo caso la prima parola (che vogliamo mantenere) . –

1

Qui sotto è il tuo codice. Ho usato le linee per dividere il testo e l'espressione regolare di Tim.

import java.util.Scanner; 
import java.io.*; 
import java.util.regex.*; 
import java.util.ArrayList; 
/** 
* 
* @author Marius 
*/ 
public class RegexSimple41 { 

    /** 
    * @param args the command line arguments 
    */ 
    public static void main(String[] args) { 
     ArrayList <String> manyLines = new ArrayList<String>(); 
     ArrayList <String> noRepeat = new ArrayList<String>(); 
     try 
     { 
      Scanner myfis = new Scanner(new File("D:\\myfis41.txt")); 

      while(myfis.hasNext()) 
      { 
       String line = myfis.nextLine(); 
       String delim = System.getProperty("line.separator"); 
       String [] lines = line.split(delim); 

       for(String s: lines) 
       { 
        if(!s.isEmpty()&&s!=null) 
        { 
         manyLines.add(s); 
        } 
       } 
      } 
      if(!manyLines.isEmpty()) 
        { System.out.print("Original text\n"); 
         for(String s: manyLines) 
         { 
          System.out.println(s); 
       } 
         } 
      if(!manyLines.isEmpty()) 
        { 
         for(String s: manyLines) 
         { 
          String result = s.replaceAll("(?i)\\b([a-z]+)\\b(?:\\s+\\1\\b)+", "$1"); 
          noRepeat.add(result); 
       } 
         } 
      if(!noRepeat.isEmpty()) 
        { System.out.print("Remove duplicates\n"); 
         for(String s: noRepeat) 
         { 
          System.out.println(s); 
       } 
         } 

     } 

     catch(Exception ex) 
     { 
      System.out.println(ex); 
     } 
    } 

} 

Buona fortuna,

+0

Grazie mille :-) – SocketM

0

codice Bellow funzionano bene

import java.util.Scanner;

importazione java.util.regex.Matcher;

importazione java.util.regex.Modello;

public class DuplicateRemoveEx {

public static void main(String[] args){ 

    String regex="(?i)\\b(\\w+)(\\b\\W+\\1\\b)+"; 
    Pattern p = Pattern.compile(regex,Pattern.CASE_INSENSITIVE); 

    Scanner in = new Scanner(System.in); 
    int numSentences = Integer.parseInt(in.nextLine()); 
    while(numSentences-- >0){ 
     String input = in.nextLine(); 
     Matcher m = p.matcher(input); 
     while(m.find()){ 
      input=input.replaceAll(regex, "$1"); 
     } 
     System.out.println(input); 
    } 
    in.close(); 
} 

}

Problemi correlati