2012-07-28 63 views
7

Así que soy completamente nuevo en Regular Expressions, y estoy tratando de usar java.util.regex de Java para encontrar signos de puntuación en las cadenas de entrada. No sabré qué tipo de puntuación obtendría antes de tiempo, excepto que (1)!,?,., ... son todas punciones válidas, y (2) "<" y ">" significan algo especial, y no cuentan como puntuación El programa en sí construye frases pseudoaleatoriamente, y quiero quitar la puntuación al final de una oración antes de que pase por el proceso aleatorio.Expresiones regulares en Puntuación

Puedo hacer coincidir palabras enteras con cualquier signo de puntuación, pero el marcador simplemente me da índices para esa palabra. En otras palabras:

Pattern p = Pattern.compile("(.*\\!)*?"); 
Matcher m = p.matcher([some input string]); 

tomará cualquier palabra con un "!" al final. Por ejemplo: - "día"

String inputString = "It is a warm Summer day!"; 
Pattern p = Pattern.compile("(.*\\!)*?"); 
Matcher m = p.matcher(inputString); 
String match = inputString.substring(m.start(), m.end()); 

resultados en> Cadena partido ~

Pero quiero que el índice de Matcher sea el "!", Así que puedo dividirlo.

Probablemente podría crear casos, y usar String.substring (...) para cada tipo de puntuación que pueda obtener, pero espero que haya algún error en mi uso de expresiones regulares para hacer esto.

+0

Oh! Dios mío, ni siquiera me di cuenta de eso. No, no fue intencional en absoluto. ¡Gracias por mencionarlo! –

Respuesta

6

me gustaría probar una expresión regular clase de caracteres similares a

"[.!?\\-]" 

Añada cualquier caracteres que desea para que coincida con el interior de las [] s. Tenga cuidado de escapar de cualquier carácter que pueda tener un significado especial para el analizador de expresiones regulares.

Luego tiene que repetir las coincidencias usando Matcher.find() hasta que devuelva falso.

+1

Sugerencia: [aquí] (http://www.regular-expressions.info/charclass.html) puede leer que * los caracteres especiales o metacaracteres dentro de una clase de caracteres son el corchete de cierre (]), la barra invertida (\), el símbolo de intercalación (^) y el guión (-) *. Los metacaracteres habituales son caracteres normales dentro de una clase de personaje. Entonces '" [\\. \\! \\?] "' Es lo mismo que '" [.!?] ' – Pshemo

+0

@Pshemo Gracias, no estaba exactamente seguro de eso. Por supuesto, no duele escapar de estos personajes de todos modos, ¿o sí? –

+0

Espero que no sea así porque también utilicé marcas de escape en mis proyectos anteriores :) – Pshemo

18

Java admite clases de caracteres POSIX de forma indirecta. Para la puntuación, el equivalente de Java de [: puntual:] es \ p {Punct}.

Por favor, consulte el siguiente link para más detalles.

Aquí es un ejemplo concreto de trabajo que utiliza la expresión en los comentarios

import java.util.regex.Matcher; 
import java.util.regex.Pattern; 

public class RegexFindPunctuation { 

    public static void main(String[] args) { 
     Pattern p = Pattern.compile("\\p{Punct}"); 

     Matcher m = p.matcher("One day! when I was walking. I found your pants? just kidding..."); 
     int count = 0; 
     while (m.find()) { 
      count++; 
      System.out.println("\nMatch number: " + count); 
      System.out.println("start() : " + m.start()); 
      System.out.println("end() : " + m.end()); 
      System.out.println("group() : " + m.group()); 
     } 
    } 
} 
+3

Es mucho mejor usar '\ pP'. – tchrist

+0

Intenté ejecutar Pattern.compile (" \\ p {Punct} ") (siguiendo el doble escape mencionado en ese enlace), pero no encuentra ningún signo de puntuación, tampoco Específicamente, ejecuté el siguiente código: Entrada de cadena = "¡Un día! cuando estaba caminando Encontré tus pantalones? es broma ... "; Patrón p = Pattern.compile (" \\ p {Punct} "); Matcher m = p.matcher (entrada); –

+2

Mismo problema que el anterior, use' Matcher.find() ' Tenga en cuenta que esto es mucho mejor con respecto al rendimiento (de la memoria) que devolver todas las coincidencias. Si simplemente quiere hacer coincidir una cadena completa, también puede escribir "comillas de entrada" ("patrón") por cierto. –