Answers:
假设您想要单引号之间的部分,请将此正则表达式与一起使用Matcher
:
"'(.*?)'"
例:
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));
}
结果:
我想要的数据
this 'is' my 'data' with quotes
它会提前停止并返回,is
而不是匹配尽可能多的字符并返回is' my 'data
,这是默认行为。
您不需要正则表达式。
将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,所以没有正则表达式的解决方案可以轻松处理多个带引号的字符串:
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)
.split('\'').get(2)
Java或某种程度的Java?我认为,如果您认为这是一种可读的解决方案,则可能需要进行脑部扫描-好像有人试图向我打些代码。
如在javascript中:
mydata.match(/'([^']+)'/)[1]
实际的正则表达式为: /'([^']+)'/
如果您使用非贪婪修饰符(根据另一篇文章),则如下所示:
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
Apache Commons Lang为java.lang API提供了许多帮助程序实用程序,最著名的是String操纵方法。在您的情况下,开始和结束子字符串相同,因此只需调用以下函数即可。
StringUtils.substringBetween(String str, String tag)
获取嵌套在同一String的两个实例之间的String。
如果开始和结束子字符串不同,则使用以下重载方法。
StringUtils.substringBetween(String str, String open, String close)
获取嵌套在两个字符串之间的字符串。
如果您想要所有匹配子字符串的实例,请使用,
StringUtils.substringsBetween(String str, String open, String close)
在字符串中搜索以开始和结束标记分隔的子字符串, 并返回array中所有匹配的子字符串。
对于有问题的示例,获取匹配子字符串的所有实例
String[] results = StringUtils.substringsBetween(mydata, "'", "'");
您可以使用它,我使用while循环将所有匹配的子字符串存储在数组中(如果使用)
if (matcher.find())
{
System.out.println(matcher.group(1));
}
您将获得比赛子串,因此您可以使用它来获取所有比赛子串
Matcher m = Pattern.compile("[a-zA-Z0-9_.+-]+@[a-zA-Z0-9-]+\\.[a-zA-Z0-9-.]+").matcher(text);
// Matcher mat = pattern.matcher(text);
ArrayList<String>matchesEmail = new ArrayList<>();
while (m.find()){
String s = m.group();
if(!matchesEmail.contains(s))
matchesEmail.add(s);
}
Log.d(TAG, "emails: "+matchesEmail);