Как извлечь подстроку с помощью 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.
как в 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