Cómo extraer una subcadena utilizando expresiones regulares

Tengo una cadena que tiene dos comillas simples, el ' carácter. Entre las comillas simples están los datos que quiero.

¿Cómo puedo escribir una expresión regular para extraer “los datos que quiero” del siguiente texto?

 mydata = "some string with 'the data i want' inside"; 

Suponiendo que quiere la parte entre comillas simples, use esta expresión regular con un Matcher :

 "'(.*?)'" 

Ejemplo:

 String mydata = "some string with 'the data i want' inside"; Pattern pattern = Pattern.compile("'(.*?)'"); Matcher matcher = pattern.matcher(mydata); if (matcher.find()) { System.out.println(matcher.group(1)); } 

Resultado:

 los datos que quiero

No necesitas expresiones regulares para esto.

Agregue apache commons lang a su proyecto ( http://commons.apache.org/proper/commons-lang/ ), luego use:

 String dataYouWant = StringUtils.substringBetween(mydata, "'"); 
 import java.util.regex.Matcher; import java.util.regex.Pattern; public class Test { public static void main(String[] args) { Pattern pattern = Pattern.compile(".*'([^']*)'.*"); String mydata = "some string with 'the data i want' inside"; Matcher matcher = pattern.matcher(mydata); if(matcher.matches()) { System.out.println(matcher.group(1)); } } } 

Porque también marcó Scala, una solución sin expresiones regulares que maneja fácilmente varias cadenas entre comillas:

 val text = "some string with 'the data i want' inside 'and even more data'" text.split("'").zipWithIndex.filter(_._2 % 2 != 0).map(_._1) res: Array[java.lang.String] = Array(the data i want, and even more data) 

Hay un simple trazador de líneas para esto:

 String target = myData.replaceAll("[^']*(?:'(.*?)')?.*", "$1"); 

Al hacer que el grupo coincidente sea opcional, esto también permite que no se encuentren las cotizaciones devolviendo un espacio en blanco en ese caso.

Ver demostración en vivo

 String dataIWant = mydata.replaceFirst(".*'(.*?)'.*", "$1"); 

como en javascript:

 mydata.match(/'([^']+)'/)[1] 

la expresión regular real es: /'([^']+)'/

si usas el modificador no codicioso (según otra publicación) es así:

 mydata.match(/'(.*?)'/)[1] 

es más limpio

En Scala,

 val ticks = "'([^']*)'".r ticks findFirstIn mydata match { case Some(ticks(inside)) => println(inside) case _ => println("nothing") } for (ticks(inside) <- ticks findAllIn mydata) println(inside) // multiple matches val Some(ticks(inside)) = ticks findFirstIn mydata // may throw exception val ticks = ".*'([^']*)'.*".r val ticks(inside) = mydata // safe, shorter, only gets the first set of ticks 

String dataIWant = mydata.split("'")[1];

Ver demostración en vivo