关于java:如何使用正则表达式提取子字符串

How to extract a substring using regex

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

如何编写regex从以下文本中提取"所需数据"?

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

假设需要单引号之间的部分,请将此正则表达式与Matcher一起使用:

1
"'(.*?)'"

例子:

1
2
3
4
5
6
7
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));
}

结果:

1
the data i want


你不需要Regex。

将apache commons lang添加到项目中(http://commons.apache.org/proper/commons lang/),然后使用:

1
String dataYouWant = StringUtils.substringBetween(mydata,"'");


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
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,这是一个不带regex的解决方案,可以轻松处理多个带引号的字符串:

1
2
3
4
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)


有一个简单的一行程序:

1
String target = myData.replaceAll("[^']*(?:'(.*?)')?.*","$1");

通过使匹配组成为可选的,在这种情况下还可以通过返回空白来满足未找到的报价。

看实况演示。


1
String dataIWant = mydata.replaceFirst(".*'(.*?)'.*","$1");


就像在javascript中一样:

1
mydata.match(/'([^']+)'/)[1]

实际regexp为:/'([^']+)'/

如果使用非贪婪修饰符(根据另一篇文章),则如下所示:

1
mydata.match(/'(.*?)'/)[1]

它更干净。


String dataIWant = mydata.split("'")[1];

看实况演示


在斯卡拉,

1
2
3
4
5
6
7
8
9
10
11
12
13
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

我同意米海烤面包机的回答,它的工作很有魅力。只是根据更新对它进行了一个小的修改。

1
2
3
4
5
6
7
8
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];
1
 

运行示例:jsfiddle