我有一个字符串,其中有两个单引号,'
字符。在单引号之间是我想要的数据。
如何编写正则表达式以从以下文本中提取“我想要的数据”?
mydata = "some string with 'the data i want' inside";
答案 0 :(得分:489)
假设您想要单引号之间的部分,请将此正则表达式与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));
}
结果:
the data i want
答案 1 :(得分:60)
你不需要正则表达式。
将apache commons lang添加到您的项目(http://commons.apache.org/proper/commons-lang/),然后使用:
String dataYouWant = StringUtils.substringBetween(mydata, "'");
答案 2 :(得分:11)
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));
}
}
}
答案 3 :(得分:9)
因为您还勾选了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)
答案 4 :(得分:7)
这有一个简单的单行:
String target = myData.replaceAll("[^']*(?:'(.*?)')?.*", "$1");
通过使匹配组可选,这也适用于在这种情况下返回空白而找不到引号。
请参阅live demo。
答案 5 :(得分:5)
String dataIWant = mydata.replaceFirst(".*'(.*?)'.*", "$1");
答案 6 :(得分:3)
在javascript中:
mydata.match(/'([^']+)'/)[1]
实际的正则表达式为:/'([^']+)'/
如果您使用非贪婪修饰符(根据另一篇文章),它就像这样:
mydata.match(/'(.*?)'/)[1]
它更干净。
答案 7 :(得分:2)
在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
答案 8 :(得分:2)
String dataIWant = mydata.split("'")[1];
请参阅Live Demo
答案 9 :(得分:1)
从该版本开始,您可以使用不带参数的新方法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...)
上面的代码段导致:
the data I want another data I want
与程序if (matcher.find())
和while (matcher.find())
的检查和处理相比,最大的优点是在获得一个或多个结果时易于使用。
答案 10 :(得分:0)
我同意Mihai Toader的上述回答,就像是魅力。只是根据更新对其进行了很小的修改。
let string = "fact-tab-1 extra stuff you dont care about"
let matchResult = string.match(/fact-tab-./);
console.log(matchResult)
console.log('The extracted part would be : ' + matchResult[0])
document.getElementById('result').innerHTML = 'The extracted part would be : ' + matchResult[0];
<div id="result">
</div>
运行示例:JSFiddle
答案 11 :(得分:0)
Apache Commons Lang为java.lang API提供了许多帮助程序实用程序,最著名的是String操纵方法。 在您的情况下,开始和结束子字符串相同,因此只需调用以下函数即可。
UIButton
获取嵌套在相同的两个实例之间的中的字符串 字符串。
如果开始和结束子字符串不同,请使用以下重载方法。
StringUtils.substringBetween(String str, String tag)
获取嵌套在两个字符串之间的字符串。
如果要匹配的子字符串的所有实例,请使用
StringUtils.substringBetween(String str, String open, String close)
在字符串中搜索以开始和结束标记分隔的子字符串, 返回数组中所有匹配的子字符串。
有关示例,以获取匹配子字符串的所有实例
StringUtils.substringsBetween(String str, String open, String close)
答案 12 :(得分:0)
您可以使用此 我使用while循环将所有匹配的子字符串存储在数组中(如果使用的话)
if (matcher.find())
{
System.out.println(matcher.group(1));
}
您将获得Match子字符串,因此可以使用它来获取所有Match子字符串
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);
答案 13 :(得分:0)
对您的 pom.xml
添加 apache.commons 依赖项<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-io</artifactId>
<version>1.3.2</version>
</dependency>
下面的代码有效。
StringUtils.substringBetween(String mydata, String "'", String "'")
答案 14 :(得分:0)
该组(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";