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

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

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

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

Ответ 1

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

Ответ 2

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

Добавьте apache commons в свой проект (http://commons.apache.org/proper/commons-lang/), затем используйте:

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

Ответ 3

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));
        }

    }
}

Ответ 4

Поскольку вы также отметили 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)

Ответ 5

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

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

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

Смотрите живое демо.

Ответ 6

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

Ответ 7

как в javascript:

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

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

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

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

он чище.

Ответ 8

В 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

Ответ 9

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

Смотрите Live Demo

Ответ 10

Apache Commons Lang предоставляет множество вспомогательных утилит для API java.lang, прежде всего методы манипулирования строками. В вашем случае начальная и конечная подстроки совпадают, поэтому просто вызовите следующую функцию.

StringUtils.substringBetween(String str, String tag)

Получает строку, вложенную в между двумя экземплярами одного и того же Строка.

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

StringUtils.substringBetween(String str, String open, String close)

Получает строку, вложенную между двумя строками.

Если вы хотите, чтобы все экземпляры совпадали подстрок, используйте

StringUtils.substringsBetween(String str, String open, String close)

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

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

String[] results = StringUtils.substringsBetween(mydata, "'", "'");