it-roy-ru.com

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

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

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

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

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

Результат:

 данные, которые я хочу 
476
Mark Byers

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

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

String dataYouWant = StringUtils.substringBetween(mydata, "'");
58
Beothorn
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));
        }

    }
}
10
Sean McEligot

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

Для этого есть простая строчка:

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

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

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

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

как в JavaScript:

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

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

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

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

это чище.

3
Mihai Toader

В Скале

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
2
Daniel C. Sobral

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

Смотрите Live Demo

2
ZehnVon12

Я согласен с ответом Mihai Toader выше, работает как шарм. Просто небольшая модификация к нему на основе обновлений.

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

0
kaushalop