Honestamente, isso deveria ter sido selecionado como a resposta.
Pat Lindley
1
Não é ainda ser contratado em input.Split ( "()" ToCharArray ().) [1]
Prabhakaran
14
e no caso u quiser usar a mesma lógica para selecionar múltiplos:var input = "(fdw) User name (sales) safdsdf (again?)"; var output = input.Split('(', ')').Where((item, index) => index % 2 != 0).ToList();
WtFudgE
1
cuidado para que este extracto solução salestambém a partir de cadeias de entrada contendo )sales(, (sales(etc
Stefano Spinucci
435
Uma maneira muito simples de fazer isso é usando expressões regulares:
Regex.Match("User name (sales)",@"\(([^)]*)\)").Groups[1].Value
Como resposta ao comentário (muito engraçado), aqui está o mesmo Regex com algumas explicações:
\( # Escaped parenthesis, means "starts with a '(' character"(# Parentheses in a regex mean "put (capture) the stuff # in between into the Groups array" [^)]# Any character that is not a ')' character*# Zero or more occurrences of the aforementioned "non ')' char")# Close the capturing group
\) # "Ends with a ')' character"
Adoro quando as pessoas dizem "uma maneira simples é usar expressões regulares" e depois oferecem o que equivale a uma série de hieróglifos indecifráveis (é especialmente divertido quando pessoas diferentes sugerem regex e cada uma delas apresenta um conjunto diferente de hieróglifos para o mesmo problema ) :)
Deltics
47
Não há respostas suficientes na pilha que realmente expliquem o que está acontecendo. Obrigado pela maravilhosa explicação.
Sandy Gifford
Se você estiver usando '@' no início, acho que não precisa escapar dos parênteses?
rank1
10
@ rank1 você deve escapar dos parênteses. O que o @ oferece aqui é que você não precisa escapar das barras invertidas. Portanto, sem o @, seria como "\\ (([^)] *) \\)").
Diadistis 28/11
Isso não lida bem com grupos aninhados. Alterado paravar filterRegex = new Regex(Regex.Escape("(") + "([^()]*)" + Regex.Escape(")"));
Jan Van der Haegen
91
Supondo que você tenha apenas um par de parênteses.
string s ="User name (sales)";int start = s.IndexOf("(")+1;int end = s.IndexOf(")", start);string result = s.Substring(start, end - start);
Expressões regulares podem ser a melhor ferramenta aqui. Se você não tem familiaridade com eles, recomendo que você instale o Expresso - uma excelente ferramenta de regex.
Obviamente, você deve calcular apenas a localização do primeiro colchete uma vez.
Martin Brown
No caso de você ter parênteses internos, por exemplo, input = "User name (sales(1))convém usar o input.LastIndexOf(')')que funcionará se houver parênteses interno ou não.
Ben
13
Um regex talvez? Eu acho que isso iria funcionar ...
using System;
using System.Text.RegularExpressions;privateIEnumerable<string>GetSubStrings(string input,string start,string end){Regex r =newRegex(Regex.Escape(start)+`"(.*?)"`+Regex.Escape(end));MatchCollection matches = r.Matches(input);foreach(Match match in matches)yieldreturn match.Groups[1].Value;}
Estou descobrindo que expressões regulares são extremamente úteis, mas muito difíceis de escrever. Então, eu fiz algumas pesquisas e encontrei essa ferramenta que facilita a escrita deles.
Não se coíbe deles, porque é difícil descobrir a sintaxe. Eles podem ser tão poderosos.
Bem-vindo ao SO! Esse é um bom conselho, mas não deveria ter sido postado como resposta. Recomendações gerais como essa devem ser postadas como comentários, se houver. Uma resposta deve abordar o problema específico do solicitante. Sei que você ainda não tem pontos de reputação suficientes para postar comentários, mas é exatamente por isso que o limite de representantes existe. Quando você tiver um pouco mais de tempo, verá que as pessoas estão sempre recomendando ferramentas como o Rubular (nos comentários, é claro). Em outras palavras, esse conselho pode ser útil, mas não é urgente.
Alan Moore
0
Me deparei com isso enquanto procurava uma solução para uma implementação muito semelhante.
Aqui está um trecho do meu código real. Inicia a substring do primeiro caractere (índice 0).
Esse código é mais rápido do que a maioria das soluções aqui (se não todas), compactado como método de extensão String , não suporta aninhamento recursivo:
publicstaticstringGetNestedString(thisstring str,char start,char end){int s =-1;int i =-1;while(++i < str.Length)if(str[i]== start){
s = i;break;}int e =-1;while(++i < str.Length)if(str[i]== end){
e = i;break;}if(e > s)return str.Substring(s +1, e - s -1);returnnull;}
Este é um pouco mais longo e mais lento, mas lida com aninhamento recursivo de maneira mais agradável:
publicstaticstringGetNestedString(thisstring str,char start,char end){int s =-1;int i =-1;while(++i < str.Length)if(str[i]== start){
s = i;break;}int e =-1;int depth =0;while(++i < str.Length)if(str[i]== end){
e = i;if(depth ==0)break;else--depth;}elseif(str[i]== start)++depth;if(e > s)return str.Substring(s +1, e - s -1);returnnull;}
Respostas:
Se você deseja evitar expressões regulares, a maneira mais simples de pensar é:
fonte
var input = "(fdw) User name (sales) safdsdf (again?)"; var output = input.Split('(', ')').Where((item, index) => index % 2 != 0).ToList();
sales
também a partir de cadeias de entrada contendo)sales(
,(sales(
etcUma maneira muito simples de fazer isso é usando expressões regulares:
Como resposta ao comentário (muito engraçado), aqui está o mesmo Regex com algumas explicações:
fonte
var filterRegex = new Regex(Regex.Escape("(") + "([^()]*)" + Regex.Escape(")"));
Supondo que você tenha apenas um par de parênteses.
fonte
int end = s.IndexOf(")", start);
. Eu enfileirei uma edição ...Use esta função:
e aqui está o uso:
e a saída seria:
fonte
Expressões regulares podem ser a melhor ferramenta aqui. Se você não tem familiaridade com eles, recomendo que você instale o Expresso - uma excelente ferramenta de regex.
Algo como:
fonte
fonte
input = "User name (sales(1))
convém usar oinput.LastIndexOf(')')
que funcionará se houver parênteses interno ou não.Um regex talvez? Eu acho que isso iria funcionar ...
fonte
fonte
Use uma expressão regular:
fonte
fonte
fonte
O
regex
método é superior, eu acho, mas se você quiser usar o humildesubstring
ou
fonte
Aqui está uma função legível de uso geral que evita o uso de regex:
Para chamá-lo em seu exemplo específico, você pode fazer:
fonte
Estou descobrindo que expressões regulares são extremamente úteis, mas muito difíceis de escrever. Então, eu fiz algumas pesquisas e encontrei essa ferramenta que facilita a escrita deles.
Não se coíbe deles, porque é difícil descobrir a sintaxe. Eles podem ser tão poderosos.
fonte
Me deparei com isso enquanto procurava uma solução para uma implementação muito semelhante.
Aqui está um trecho do meu código real. Inicia a substring do primeiro caractere (índice 0).
fonte
Esse código é mais rápido do que a maioria das soluções aqui (se não todas), compactado como método de extensão String , não suporta aninhamento recursivo:
Este é um pouco mais longo e mais lento, mas lida com aninhamento recursivo de maneira mais agradável:
fonte