Как извлечь подстроку с помощью regex

у меня есть строка, в которой есть две одинарные кавычки,' символ. Между одинарными кавычками находятся данные, которые мне нужны.

Как я могу написать регулярное выражение для извлечения "данных, которые я хочу" из следующего текста?

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

9 ответов


предполагая, что вы хотите часть между одинарными кавычками, используйте это регулярное выражение с 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

вам не нужно регулярное выражение для этого.

добавьте 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)

для этого есть простой однострочный:

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

делая соответствующую группу необязательной, это также обслуживает кавычки, которые не найдены, возвращая пустое место в этом случае.

посмотреть live demo.


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

как в javascript:

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

фактическое регулярное выражение: /'([^']+)'/

Если вы используете не жадный модификатор (согласно другому сообщению), это выглядит так:

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

она чище.


В 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

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

посмотреть Live Demo