Yanıtlar:
Tek tırnak işaretleri arasında yer almak istediğinizi varsayarsak, bu normal ifadeyi aşağıdakilerle birlikte kullanın Matcher
:
"'(.*?)'"
Misal:
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));
}
Sonuç:
istediğim veriler
this 'is' my 'data' with quotes
erken durur ve is
mümkün olduğunca çok karakter eşleştirmek yerine geri döner is' my 'data
ve varsayılan davranış olan geri döner .
Bunun için normal ifadeye ihtiyacınız yok.
Projenize apache commons lang ekleyin ( http://commons.apache.org/proper/commons-lang/ ), ardından şunu kullanın:
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));
}
}
}
Bunun için basit bir astar var:
String target = myData.replaceAll("[^']*(?:'(.*?)')?.*", "$1");
Eşleşen grubu isteğe bağlı hale getirerek, bu durumda bir boşluk döndürülerek tırnak bulunamaması da sağlanır.
Canlı demoya bakın .
Ayrıca, birden fazla alıntılanan dizeyle kolayca ilgilenen normal ifadesiz bir çözüm olan Scala'yı işaretlediniz:
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'da böyle bir şey olmasın ? Bence bu okunabilir bir çözüm olduğunu düşünüyorsanız bir beyin taraması yapmanız gerekebilir - birisi bana bir kod golf yapmaya çalışıyor gibi görünüyor.
javascript'teki gibi:
mydata.match(/'([^']+)'/)[1]
gerçek ifade: /'([^']+)'/
açgözlü olmayan değiştiriciyi kullanırsanız (başka bir gönderiye göre) şöyle:
mydata.match(/'(.*?)'/)[1]
daha temiz.
Scala'da,
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];
Canlı Demoya Bakın
Apache Commons Lang, java.lang API için, özellikle Dize düzenleme yöntemleri için bir dizi yardımcı yardımcı program sağlar. Sizin durumunuzda, başlangıç ve bitiş alt dizeleri aynıdır, bu nedenle aşağıdaki işlevi çağırmanız yeterlidir.
StringUtils.substringBetween(String str, String tag)
Aynı Dize'nin iki örneği arasında yuvalanan Dizeyi alır .
Başlangıç ve bitiş alt dizeleri farklıysa, aşağıdaki aşırı yüklenmiş yöntemi kullanın.
StringUtils.substringBetween(String str, String open, String close)
İki dize arasında yuvalanmış dize alır.
Eşleşen alt dizelerin tüm örneklerini istiyorsanız,
StringUtils.substringsBetween(String str, String open, String close)
Dizede eşleşen tüm alt dizeleri döndürerek bir başlangıç ve bitiş etiketiyle ayrılmış alt dizeleri arar .
Söz konusu örnekte eşleşen alt dizenin tüm örneklerini almak için
String[] results = StringUtils.substringsBetween(mydata, "'", "'");
Eğer kullanırsanız dizideki tüm eşleşmeler alt dizesini saklamak için while döngüsü kullanabilirsiniz
if (matcher.find())
{
System.out.println(matcher.group(1));
}
eşleşmeler alt dize alırsınız, böylece tüm eşleşmeler alt dize almak için bunu kullanabilirsiniz
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);
Bazı grup (1) benim için çalışmadı. URL sürümünü bulmak için grup (0) kullandım.
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";