Ответы:
Предполагая, что вы хотите разделить одинарные кавычки, используйте это регулярное выражение с 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
, что является поведением по умолчанию.
Вам не нужно регулярное выражение для этого.
Добавьте 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));
}
}
}
Для этого есть простая строчка:
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
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 подстрок, разделенных начальным и конечным тегами, возвращая все соответствующие подстроки в массиве .
Для рассматриваемого примера получить все экземпляры совпадающей подстроки
String[] results = StringUtils.substringsBetween(mydata, "'", "'");
Вы можете использовать это, я использую цикл while для хранения всех подстрок совпадений в массиве, если вы используете
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";