如何使用正则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");