Witam, mam problem z wyciągnięciem nazwy pliku za pomocą Regex bez rozszerzenia.
Chodzi mi o to, aby mając plik nazwapliku.mp3 uzyskać nazwapliku.
Z góry dzięki za pomoc
(.*?)\.
w grupie \1
będzie nazwa do pierwszej kropki.
(.*)\.
w grupie \1
będzie nazwa do ostatniej kropki.
Hint: To bardzo proste wyrażenia - niżej masz też bardziej skomplikowane (lepsze).
Czasami łatwiej coś zrobić bez regexa:
var fullname = "nazwa.pliku.mp3";
var name = name.Substring(0,fullname.LastIndexOf('.'));
Niestety muszę to zrobić za pomocą regexa.
(.*).
wyświetla wraz z kropką, a mi jest potrzebne bez.
Nie patrz na match tylko na grupę \1
.
A tutaj masz całą opowieść o wyrażeniu regularnym dla nazw plików: http://movingtofreedom.org/2008/04/01/regex-match-filename-base-and-extension/
Ostatecznie pokazują tam taki regex: (.*?)(\.[^.]*$|$)
.
To korzystając z regexa od @Endrju, chyba będzie tak:
var fullname = "bardzo.dluga.nazwa.pliku.mp3";
var pattern = @"(.*?)(\.[^.]*$|$)";
Console.WriteLine(Regex.Split(fullname, pattern)[1]);
Trochę się pogubiłem.
Mój problem polega na tym, że w windows formsie robię odtwarzacz muzyki i przy otwieraniu plików mp3 chcę wypisać do listboxa nazwy piosenek bez rozszerzenia.
Nie bardzo wiem o co chodzi z tymi grupami w regexie.
string[] plik, sciezka;
Regex r = new Regex(@"(.*)\.");
private void otwórzToolStripMenuItem_Click(object sender, EventArgs e)
{
OpenFileDialog otworz = new OpenFileDialog();
openFileDialog1.Multiselect = true;
if (openFileDialog1.ShowDialog() == System.Windows.Forms.DialogResult.OK)
{
plik = openFileDialog1.SafeFileNames;
sciezka = openFileDialog1.FileNames;
for (int i = 0; i < plik.Length; i++)
{
MatchCollection matches = r.Matches(plik[i]);
foreach (Match match in matches)
{
listBox1.Items.Add(match);
}
}
foreach (string d in otworz.FileNames)
{
listBox1.Items.Add(d);
}
}
}
Tak wygląda u mnie wczytywanie i wypisywanie do listboxa nazw piosenek, z tym, że wypisuje mi je z kropkami na końcu.
Używasz nie tego wyrażenia.
A tak w ogóle to nie potrzebujesz tego regexa
System.IO.Path.GetFileNameWithoutExtension("file.exe")
Zwróci nazwę bez rozszerzenia.
Chcąc nie chcąc muszę użyć regexa.
No to czemu nie zrobisz tego tak jak pokazałem w dodatku używając jakiegoś innego wyrażenia?
Regex r = new Regex(@"(.*?)(\.[^.]*$|$)");
if (openFileDialog1.ShowDialog() == System.Windows.Forms.DialogResult.OK)
{
plik = openFileDialog1.SafeFileNames;
sciezka = openFileDialog1.FileNames;
foreach(var p in plik)
listbox1.Items.Add(r.Split(p)[1]);
foreach (string d in otworz.FileNames)
{
listBox1.Items.Add(d);
}
}