Відповіді:
Припустимо, що ви хочете розділити між цитатами, використовуйте цей регулярний вираз із 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));
}
Результат:
дані, які я хочу
this 'is' my 'data' with quotes
він зупинився рано і повернувся is
замість того, щоб відповідати якомога більше символів і повернутись is' my 'data
, що є поведінкою за замовчуванням.
Для цього вам не потрібен регулярний вираз.
Додайте до свого проекту апаш-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));
}
}
}
Для цього є простий однострочний:
String target = myData.replaceAll("[^']*(?:'(.*?)')?.*", "$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)
.split('\'').get(2)
чи щось до цього ступеня на Java? Я думаю, що вам може знадобитися зробити сканування мозку, якщо ви вважаєте, що це читабельне рішення - схоже, хтось намагався зробити мені якийсь гольф коду.
як у JavaScript:
mydata.match(/'([^']+)'/)[1]
фактичне регулярне вираження: /'([^']+)'/
якщо ви використовуєте не жадібний модифікатор (за іншою публікацією), це так:
mydata.match(/'(.*?)'/)[1]
вона чистіша.
У Скалі,
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];
Дивіться демо-версію
Apache Commons Lang надає безліч допоміжних утиліт для API java.lang, найбільш важливих методів маніпулювання рядками. У вашому випадку початкові та кінцеві підрядки однакові, тому просто зателефонуйте на наступну функцію.
StringUtils.substringBetween(String str, String tag)
Отримує рядок, яка вкладена між двома екземплярами однієї струни .
Якщо початкова та кінцева підрядки різні, то використовуйте наступний метод перевантаження.
StringUtils.substringBetween(String str, String open, String close)
Отримує рядок, яка вкладена між двома рядками.
Якщо ви хочете, щоб усі екземпляри відповідних підрядів використовували,
StringUtils.substringsBetween(String str, String open, String close)
Шукає рядок для підрядів, розділених тегом початку та кінця, повертаючи всі відповідні підрядки в масиві .
Для відповідного прикладу, щоб отримати всі екземпляри відповідної підрядки
String[] results = StringUtils.substringsBetween(mydata, "'", "'");
Ви можете використовувати це, що я використовую, поки цикл, щоб зберігати всі підрядки збігів у масиві, якщо ви використовуєте
if (matcher.find())
{
System.out.println(matcher.group(1));
}
ви отримаєте на підрядку матчів, щоб ви могли використовувати це, щоб отримати всі підрядки збігів
Matcher m = Pattern.compile("[a-zA-Z0-9_.+-]+@[a-zA-Z0-9-]+\\.[a-zA-Z0-9-.]+").matcher(text);
// Matcher mat = pattern.matcher(text);
ArrayList<String>matchesEmail = new ArrayList<>();
while (m.find()){
String s = m.group();
if(!matchesEmail.contains(s))
matchesEmail.add(s);
}
Log.d(TAG, "emails: "+matchesEmail);
Деякі, як група (1) не працювала на мене. Я використовував групу (0), щоб знайти версію URL.
Pattern urlVersionPattern = Pattern.compile("\\/v[0-9][a-z]{0,1}\\/");
Matcher m = urlVersionPattern.matcher(url);
if (m.find()) {
return StringUtils.substringBetween(m.group(0), "/", "/");
}
return "v0";