如何使用正则expression式提取子string

我有一个string,它有两个单引号, '字符。 在单引号之间是我想要的数据。

我如何写一个正则expression式从下面的文本中提取“我想要的数据”?

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

假设你想要单引号之间的部分,用Matcher使用这个正则expression式:

 "'(.*?)'" 

例:

 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)); } 

结果:

我想要的数据

你不需要这个正则expression式。

将apache commons lang添加到您的项目( http://commons.apache.org/proper/commons-lang/ ),然后使用:

 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)); } } } 

因为你也勾选了Scala,一个没有正则expression式的解决scheme,它很容易处理多个引用的string:

 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) 

如在javascript中:

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

实际的正则expression式是: /'([^']+)'/

如果你使用非贪心修饰符(按照另一篇文章),就像这样:

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

它更干净。

在斯卡拉,

 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 target = myData.replaceAll("[^']*(?:'(.*?)')?.*", "$1"); 

通过使匹配组成为可选项,这也可以在这种情况下,通过返回一个空白来满足找不到的引用。

看现场演示 。

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

请参阅实时演示

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