Respostas:
Supondo que você queira a parte entre aspas simples, use esta expressão regular com um Matcher
:
"'(.*?)'"
Exemplo:
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));
}
Resultado:
os dados que eu quero
this 'is' my 'data' with quotes
parava mais cedo e retornava, em is
vez de corresponder ao máximo de caracteres possível e retornava is' my 'data
, que é o comportamento padrão.
Você não precisa de regex para isso.
Adicione o apache commons lang ao seu projeto ( http://commons.apache.org/proper/commons-lang/ ) e use:
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));
}
}
}
Existe uma linha simples para isso:
String target = myData.replaceAll("[^']*(?:'(.*?)')?.*", "$1");
Ao tornar o grupo correspondente opcional, isso também serve para cotações não encontradas retornando um espaço em branco nesse caso.
Veja demonstração ao vivo .
Como você também marcou o Scala, uma solução sem regex que lida facilmente com várias seqüências de caracteres citadas:
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)
ou algo nesse sentido em Java? Acho que você pode precisar fazer uma varredura cerebral se achar que é uma solução legível - parece que alguém estava tentando fazer algum código de golfe para mim.
como em javascript:
mydata.match(/'([^']+)'/)[1]
o regexp real é: /'([^']+)'/
se você usar o modificador não guloso (como em outro post), é assim:
mydata.match(/'(.*?)'/)[1]
é mais limpo.
Em 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];
Veja demonstração ao vivo
O Apache Commons Lang fornece vários utilitários auxiliares para a API java.lang, principalmente os métodos de manipulação de String. No seu caso, as substrings inicial e final são as mesmas, então chame a seguinte função.
StringUtils.substringBetween(String str, String tag)
Obtém a String aninhada entre duas instâncias da mesma String .
Se as substrings inicial e final forem diferentes, use o seguinte método sobrecarregado.
StringUtils.substringBetween(String str, String open, String close)
Obtém a String aninhada entre duas Strings.
Se você deseja todas as instâncias das substrings correspondentes, use,
StringUtils.substringsBetween(String str, String open, String close)
Procura em String por substrings delimitados por uma tag de início e fim, retornando todas as substrings correspondentes em uma matriz .
Para o exemplo em questão, obter todas as instâncias da substring correspondente
String[] results = StringUtils.substringsBetween(mydata, "'", "'");
você pode usar isso eu uso while loop para armazenar todas as correspondências de substring na matriz, se você usar
if (matcher.find())
{
System.out.println(matcher.group(1));
}
você obterá a correspondência de substring para poder usá-lo para obter todas as correspondências de substring
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);
De alguma forma, como o grupo (1) não funcionou para mim. Eu usei o grupo (0) para encontrar a versão do 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";