如何使用正则表达式提取子字符串

时间:2011-01-11 20:22:49

标签: java regex string text-extraction

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

如何编写正则表达式以从以下文本中提取“我想要的数据”?

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

15 个答案:

答案 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)

自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...)

上面的代码段导致:

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";