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

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

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

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

Ответы [ 10 ]

497 голосов
/ 11 января 2011

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

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

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

String dataYouWant = StringUtils.substringBetween(mydata, "'");
11 голосов
/ 11 января 2011
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));
        }

    }
}
9 голосов
/ 15 января 2017

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

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

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

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

9 голосов
/ 12 января 2011

Поскольку вы также отметили 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 голосов
/ 13 сентября 2017
String dataIWant = mydata.replaceFirst(".*'(.*?)'.*", "$1");
3 голосов
/ 11 января 2011

как в JavaScript:

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

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

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

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

чище.

2 голосов
/ 16 августа 2017

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

См. Демо-версия

2 голосов
/ 12 января 2011

В Скале

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
0 голосов
/ 12 октября 2018

Я согласен с приведенным выше ответом Михая Тоадера, работает как шарм. Небольшая модификация, основанная на обновлениях.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...