我有一个字符串,里面有两个单引号,'字符。在单引号之间是我想要的数据。
我怎么能写一个正则表达式提取“我想要的数据”从下面的文本?
mydata = "some string with 'the data i want' inside";
我有一个字符串,里面有两个单引号,'字符。在单引号之间是我想要的数据。
我怎么能写一个正则表达式提取“我想要的数据”从下面的文本?
mydata = "some string with 'the data i want' inside";
当前回答
从Java 9开始
在这个版本中,你可以使用不带参数的新方法Matcher::results,它能够轻松地返回Stream<MatchResult>,其中MatchResult表示匹配操作的结果,并提供读取匹配的组和更多信息(这个类从Java 1.5开始就知道了)。
String string = "Some string with 'the data I want' inside and 'another data I want'.";
Pattern pattern = Pattern.compile("'(.*?)'");
pattern.matcher(string)
.results() // Stream<MatchResult>
.map(mr -> mr.group(1)) // Stream<String> - the 1st group of each result
.forEach(System.out::println); // print them out (or process in other way...)
上面的代码片段导致:
我想要的数据 我想要的另一个数据
与过程性的if (matcher.find())和while (matcher.find())检查和处理相比,最大的优势在于当有一个或多个结果可用时使用起来更容易。
其他回答
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));
}
}
}
这群人对我不起作用。我使用group(0)来查找url版本。
Pattern urlVersionPattern = Pattern.compile("\\/v[0-9][a-z]{0,1}\\/");
Matcher m = urlVersionPattern.matcher(url);
if (m.find()) {
return StringUtils.substringBetween(m.group(0), "/", "/");
}
return "v0";
在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
你可以用这个 我使用while循环存储所有匹配子字符串在数组中,如果你使用
如果(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);
这里有一个简单的语句:
String target = myData.replaceAll("[^']*(?:'(.*?)')?.*", "$1");
通过将匹配组设置为可选,还可以通过在这种情况下返回空白来满足找不到引号的需求。
见现场演示。