Как извлечь подстроку с помощью регулярного выражения
у меня есть строка, в которой есть две одинарные кавычки,'
символ. Между одинарными кавычками есть данные, которые я хочу.
Как я могу написать регулярное выражение, чтобы извлечь "данные, которые я хочу" из следующего текста?
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("[^']*(?:'(.*?)')?.*", "");
делая соответствующую группу необязательной, это также позволяет не находить кавычки, возвращая в этом случае пустое значение.
посмотреть демо.
как в 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
String dataIWant = mydata.split("'")[1];
посмотреть Демо