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

232

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

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

mydata = "some string with 'the data i want' inside";
Теги:
string
text-extraction

9 ответов

390
Лучший ответ

Предполагая, что вам нужна часть между одинарными кавычками, используйте это регулярное выражение с 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
  • 12
    блин .. я всегда забываю о не жадном модификаторе :(
  • 27
    замените «если» на «время», если вы ожидаете более одного случая
Показать ещё 10 комментариев
46

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

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

String dataYouWant = StringUtils.substringBetween(mydata, "'");
  • 0
    спасибо ..... я новичок в регулярных выражениях ... так что я думаю, что это простой способ ....
  • 9
    Вы должны принять во внимание, как ваше программное обеспечение будет распространяться. Если это что-то вроде веб-стартапа, не стоит добавлять Apache Commons только для использования этой единственной функциональности. Но, возможно, это не так. Кроме того, Apache Commons может предложить гораздо больше. Даже несмотря на то, что хорошо знать регулярное выражение, нужно быть осторожным, когда его использовать. Regex может быть очень трудно читать, писать и отлаживать. Учитывая некоторый контекст, использование этого может быть лучшим решением.
Показать ещё 3 комментария
9
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));
        }

    }
}
  • 2
    System.out.println (matcher.group (0)); <--- Индекс на основе нуля
  • 2
    Номер группы (0) имеет особое значение, группы захвата начинаются с индексной группы (1) (т. Е. Группа (1) является правильной в ответе). «Захватывающие группы индексируются слева направо, начиная с единицы. Нулевая группа обозначает весь шаблон» - Источник: docs.oracle.com/javase/8/docs/api/java/util/regex/…
Показать ещё 1 комментарий
8

Поскольку вы также отметили 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)
  • 0
    Умная. Любил это.
  • 3
    Так читаемое решение, поэтому люди любят скала, я верю :)
Показать ещё 1 комментарий
3

Для этого существует простой однострочный:

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

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

Смотрите живая демонстрация.

3

как в javascript:

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

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

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

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

он чище.

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
1
String dataIWant = mydata.replaceFirst(".*'(.*?)'.*", "$1");
  • 1
    Пожалуйста, объясните ваш код.
1

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

Смотрите Live Demo

Ещё вопросы

Сообщество Overcoder
Наверх
Меню