Bukankah itu akan dikontrak lebih lanjut menjadi input. Plit ("()". ToCharArray ()) [1]
prabhakaran
14
dan jika Anda ingin menggunakan logika yang sama untuk memilih beberapa:var input = "(fdw) User name (sales) safdsdf (again?)"; var output = input.Split('(', ')').Where((item, index) => index % 2 != 0).ToList();
WtFudgE
1
berhati-hatilah karena ekstrak solusi ini salesjuga dari string input yang mengandung )sales(, (sales(dll.
Stefano Spinucci
435
Cara yang sangat sederhana untuk melakukannya adalah dengan menggunakan ekspresi reguler:
Regex.Match("User name (sales)",@"\(([^)]*)\)").Groups[1].Value
Sebagai tanggapan terhadap komentar (sangat lucu), inilah Regex yang sama dengan beberapa penjelasan:
\( # 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"
Saya suka ketika orang mengatakan "cara sederhana adalah dengan menggunakan ekspresi reguler" dan kemudian menawarkan jumlah yang setara dengan deretan hieroglif yang tidak dapat diuraikan (terutama menyenangkan ketika orang yang berbeda menyarankan regex dan masing-masing muncul dengan serangkaian hieroglif yang berbeda untuk masalah yang sama) ). :)
Deltics
47
Hampir tidak ada jawaban yang cukup pada tumpukan yang benar-benar menjelaskan apa yang terjadi. Terima kasih atas penjelasannya.
Sandy Gifford
Jika Anda menggunakan '@' di awal saya pikir Anda tidak perlu melarikan diri tanda kurung?
peringkat 1
10
@ rank1 Anda harus melarikan diri dari kurung. Apa yang ditawarkan @ di sini adalah Anda tidak perlu melarikan diri dari garis miring terbalik. Jadi tanpa @ itu akan seperti "\\ (([^)] *) \\)".
Diadistis
Ini tidak menangani grup bersarang dengan baik. Diubah menjadivar filterRegex = new Regex(Regex.Escape("(") + "([^()]*)" + Regex.Escape(")"));
Jan Van der Haegen
91
Dengan asumsi bahwa Anda hanya memiliki sepasang kurung.
string s ="User name (sales)";int start = s.IndexOf("(")+1;int end = s.IndexOf(")", start);string result = s.Substring(start, end - start);
Ekspresi reguler mungkin menjadi alat terbaik di sini. Jika Anda tidak terbiasa dengan mereka, saya sarankan Anda menginstal Expresso - alat regex kecil yang hebat.
Tentu saja Anda hanya perlu menghitung lokasi braket pertama satu kali.
Martin Brown
Dalam kasus di mana Anda memiliki kurung dalam misalnya input = "User name (sales(1))Anda mungkin ingin menggunakan input.LastIndexOf(')')yang akan bekerja jika ada kurung dalam atau tidak.
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;}
Saya menemukan bahwa ekspresi reguler sangat berguna tetapi sangat sulit untuk ditulis. Jadi, saya melakukan riset dan menemukan alat ini yang membuat penulisan mereka jadi mudah.
Jangan menghindar dari mereka karena sintaksinya sulit untuk dipecahkan. Mereka bisa sangat kuat.
Selamat datang di SO! Ini saran yang bagus, tetapi seharusnya tidak diposting sebagai jawaban. Nasihat umum seperti ini harus diposting sebagai komentar, jika ada. Jawaban harus mengatasi masalah khusus si penanya. Saya tahu Anda belum memiliki poin reputasi yang cukup untuk mengirim komentar, tetapi inilah alasan mengapa ambang batas rep ada. Ketika Anda sudah ada sedikit lebih lama, Anda akan melihat bahwa orang selalu merekomendasikan alat seperti Rubular (dalam komentar, tentu saja). Dengan kata lain, saran ini mungkin bermanfaat, tetapi tidak mendesak.
Alan Moore
0
Saya menemukan ini ketika saya sedang mencari solusi untuk implementasi yang sangat mirip.
Ini cuplikan dari kode saya yang sebenarnya. Mulai substring dari char pertama (indeks 0).
Kode ini lebih cepat daripada kebanyakan solusi di sini (jika tidak semua), dikemas sebagai metode ekstensi String , ini tidak mendukung penyatuan rekursif:
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;}
Yang ini sedikit lebih lama dan lebih lambat, tetapi ia menangani sarang rekursif dengan lebih baik:
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;}
Jawaban:
Jika Anda ingin menjauh dari ekspresi reguler, cara paling sederhana yang dapat saya pikirkan adalah:
sumber
var input = "(fdw) User name (sales) safdsdf (again?)"; var output = input.Split('(', ')').Where((item, index) => index % 2 != 0).ToList();
sales
juga dari string input yang mengandung)sales(
,(sales(
dll.Cara yang sangat sederhana untuk melakukannya adalah dengan menggunakan ekspresi reguler:
Sebagai tanggapan terhadap komentar (sangat lucu), inilah Regex yang sama dengan beberapa penjelasan:
sumber
var filterRegex = new Regex(Regex.Escape("(") + "([^()]*)" + Regex.Escape(")"));
Dengan asumsi bahwa Anda hanya memiliki sepasang kurung.
sumber
int end = s.IndexOf(")", start);
. Saya sudah mengantri hasil edit ...Gunakan fungsi ini:
dan di sini adalah penggunaannya:
dan hasilnya adalah:
sumber
Ekspresi reguler mungkin menjadi alat terbaik di sini. Jika Anda tidak terbiasa dengan mereka, saya sarankan Anda menginstal Expresso - alat regex kecil yang hebat.
Sesuatu seperti:
sumber
sumber
input = "User name (sales(1))
Anda mungkin ingin menggunakaninput.LastIndexOf(')')
yang akan bekerja jika ada kurung dalam atau tidak.Regex mungkin? Saya pikir ini akan berhasil ...
sumber
sumber
Gunakan Ekspresi Reguler:
sumber
sumber
sumber
The
regex
Metode unggul Saya pikir, tetapi jika Anda ingin menggunakan rendah hatisubstring
atau
sumber
Berikut adalah fungsi yang dapat dibaca untuk tujuan umum yang menghindari penggunaan regex:
Untuk menyebutnya dalam contoh khusus Anda, Anda dapat melakukan:
sumber
Saya menemukan bahwa ekspresi reguler sangat berguna tetapi sangat sulit untuk ditulis. Jadi, saya melakukan riset dan menemukan alat ini yang membuat penulisan mereka jadi mudah.
Jangan menghindar dari mereka karena sintaksinya sulit untuk dipecahkan. Mereka bisa sangat kuat.
sumber
Saya menemukan ini ketika saya sedang mencari solusi untuk implementasi yang sangat mirip.
Ini cuplikan dari kode saya yang sebenarnya. Mulai substring dari char pertama (indeks 0).
sumber
Kode ini lebih cepat daripada kebanyakan solusi di sini (jika tidak semua), dikemas sebagai metode ekstensi String , ini tidak mendukung penyatuan rekursif:
Yang ini sedikit lebih lama dan lebih lambat, tetapi ia menangani sarang rekursif dengan lebih baik:
sumber