Szczerze mówiąc, powinno to zostać wybrane jako odpowiedź.
Pat Lindley,
1
Czy nie będzie dalej zawężany do input.Split („()”. ToCharArray ()) [1]
prabhakaran
14
a jeśli chcesz użyć tej samej logiki, aby wybrać wiele:var input = "(fdw) User name (sales) safdsdf (again?)"; var output = input.Split('(', ')').Where((item, index) => index % 2 != 0).ToList();
WtFudgE 25.04.16
1
pamiętaj, że ten ekstrakt rozwiązanie salestakże z ciągów wejściowych zawierających )sales(, (sales(etc
Stefano Spinucci
435
Bardzo prostym sposobem na to jest użycie wyrażeń regularnych:
Regex.Match("User name (sales)",@"\(([^)]*)\)").Groups[1].Value
W odpowiedzi na (bardzo zabawny) komentarz, oto ten sam Regex z wyjaśnieniem:
\( # 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"
Uwielbiam to, gdy ludzie mówią: „prostym sposobem jest użycie wyrażeń regularnych”, a następnie oferują to, co stanowi ciąg nieczytelnych hieroglifów (jest to szczególnie zabawne, gdy różni ludzie sugerują wyrażenia regularne i każdy z nich ma inny zestaw hieroglifów dla tego samego problemu ). :)
Deltics
47
Na stosie nie ma wystarczającej liczby odpowiedzi, które faktycznie wyjaśniają, co się dzieje. Dziękuję za cudowne wyjaśnienie.
Sandy Gifford
Jeśli używasz „@” na początku, myślę, że nie musisz uciec od nawiasu?
ranga 1
10
@ rank1 musisz uciec od nawiasu. @ Oferuje tutaj to, że nie musisz uciekać przed ukośnikami. Więc bez @ byłoby to jak „\\ (([^)] *) \\)”.
Diadistis,
Nie radzi sobie to jednak dobrze z grupami zagnieżdżonymi. Zmieniono navar filterRegex = new Regex(Regex.Escape("(") + "([^()]*)" + Regex.Escape(")"));
Jan Van der Haegen,
91
Zakładając, że masz tylko jedną parę nawiasów.
string s ="User name (sales)";int start = s.IndexOf("(")+1;int end = s.IndexOf(")", start);string result = s.Substring(start, end - start);
Wyrażenia regularne mogą być tutaj najlepszym narzędziem. Jeśli nie jesteś z nimi zaznajomiony, zalecamy zainstalowanie Expresso - świetnego małego narzędzia do wyrażania regularnego.
Oczywiście należy tylko raz obliczyć lokalizację pierwszego nawiasu.
Martin Brown,
W przypadku, gdy masz wewnętrzny nawias, np. input = "User name (sales(1))Możesz chcieć użyć tego, input.LastIndexOf(')')który zadziała, jeśli istnieje wewnętrzny nawias lub nie.
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;}
Uważam, że wyrażenia regularne są niezwykle przydatne, ale bardzo trudne do napisania. Przeprowadziłem badania i znalazłem to narzędzie, które sprawia, że pisanie ich jest tak łatwe.
Nie wahaj się przed nimi, ponieważ trudno jest zrozumieć składnię. Mogą być tak potężni.
Witamy w SO! To dobra rada, ale nie powinna być opublikowana jako odpowiedź. Takie ogólne porady powinny być zamieszczane jako komentarze, jeśli w ogóle. Odpowiedź musi dotyczyć konkretnego problemu pytającego. Wiem, że nie masz jeszcze wystarczającej liczby punktów reputacji, aby dodawać komentarze, ale właśnie dlatego istnieje próg rep. Gdy będziesz już trochę dłużej, zobaczysz, że ludzie zawsze polecają narzędzia takie jak Rubular (oczywiście w komentarzach). Innymi słowy, ta rada może być przydatna, ale nie jest pilna.
Alan Moore
0
Natknąłem się na to, kiedy szukałem rozwiązania bardzo podobnej implementacji.
Oto fragment mojego faktycznego kodu. Rozpoczyna podciąg od pierwszego znaku (indeks 0).
Ten kod jest szybszy niż większość dostępnych tutaj rozwiązań (jeśli nie wszystkie), spakowany jako metoda rozszerzenia String , nie obsługuje zagnieżdżania rekurencyjnego:
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;}
Ten jest trochę dłuższy i wolniejszy, ale ładniej radzi sobie z zagnieżdżaniem rekurencyjnym:
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;}
Odpowiedzi:
Jeśli chcesz trzymać się z dala od wyrażeń regularnych, najprostszym sposobem, jaki mogę wymyślić, jest:
źródło
var input = "(fdw) User name (sales) safdsdf (again?)"; var output = input.Split('(', ')').Where((item, index) => index % 2 != 0).ToList();
sales
także z ciągów wejściowych zawierających)sales(
,(sales(
etcBardzo prostym sposobem na to jest użycie wyrażeń regularnych:
W odpowiedzi na (bardzo zabawny) komentarz, oto ten sam Regex z wyjaśnieniem:
źródło
var filterRegex = new Regex(Regex.Escape("(") + "([^()]*)" + Regex.Escape(")"));
Zakładając, że masz tylko jedną parę nawiasów.
źródło
int end = s.IndexOf(")", start);
. Mam w kolejce edycję ...Użyj tej funkcji:
a oto użycie:
i wynik byłby:
źródło
Wyrażenia regularne mogą być tutaj najlepszym narzędziem. Jeśli nie jesteś z nimi zaznajomiony, zalecamy zainstalowanie Expresso - świetnego małego narzędzia do wyrażania regularnego.
Coś jak:
źródło
źródło
input = "User name (sales(1))
Możesz chcieć użyć tego,input.LastIndexOf(')')
który zadziała, jeśli istnieje wewnętrzny nawias lub nie.Może regex? Myślę, że to zadziała ...
źródło
źródło
Użyj wyrażenia regularnego:
źródło
źródło
źródło
regex
Metoda jest lepsza myślę, ale jeśli chciał użyć pokornychsubstring
lub
źródło
Oto funkcja ogólnego przeznaczenia, która pozwala uniknąć wyrażeń regularnych:
Aby nazwać to w konkretnym przykładzie, możesz:
źródło
Uważam, że wyrażenia regularne są niezwykle przydatne, ale bardzo trudne do napisania. Przeprowadziłem badania i znalazłem to narzędzie, które sprawia, że pisanie ich jest tak łatwe.
Nie wahaj się przed nimi, ponieważ trudno jest zrozumieć składnię. Mogą być tak potężni.
źródło
Natknąłem się na to, kiedy szukałem rozwiązania bardzo podobnej implementacji.
Oto fragment mojego faktycznego kodu. Rozpoczyna podciąg od pierwszego znaku (indeks 0).
źródło
Ten kod jest szybszy niż większość dostępnych tutaj rozwiązań (jeśli nie wszystkie), spakowany jako metoda rozszerzenia String , nie obsługuje zagnieżdżania rekurencyjnego:
Ten jest trochę dłuższy i wolniejszy, ale ładniej radzi sobie z zagnieżdżaniem rekurencyjnym:
źródło