Regexp файл без расширения
which of course work only if the filename has one extension. But if it is adfadsfads.blah.txt I just want adfadsfads.blah . How can I do this with regex?
In regards to David's question, 'why would you use regex' for this, the answer is, 'for fun.' In fact, the code I'm using is simple
but I like to learn regex whenever possible because it always comes up at Geek cocktail parties.
Daniel, in such a case I would recommend you to purchase a tool like RegexBuddy. It is more fun to play with regex if you have a tool like that. You can even debug regular expressions in such a tool. A really recommend that.
9 Answers 9
- Capture filenames that start with a dot (e.g. .logs is a file named .logs , not a file extension), which is common in Unix.
- Gets everything but the last dot: foo.bar.jpg gets you foo.bar .
- Handles files with no dot: secret-letter gets you secret-letter .
Note: as commenter j_random_hacker suggested, this performs as advertised, but you might want to precede things with an anchor for readability purposes.
Although this does work as advertised, could I suggest prepending a "^" anchor just for readability's sake? Without the anchor, a programmer seeing this regex for the first time needs to perform a detailed analysis to verify that returned match always starts at the start of the string.
Everything followed by a dot followed by one or more characters that's not a dot, followed by the end-of-string:
The everything-before-the-last-dot is grouped for easy retrieval.
If you aren't 100% sure every file will have an extension, try:
how about 2 captures one for the end and one for the filename.
That's all fine, but since I'll be throwing out the filename, why bother? I would like a regex that just gets the filename.
- Gets the Path without the last \
- The file without extension
- The the extension with a .
Does not support multiple . in file name Does support . in file path
I realize this question is a bit outdated, however, I had some trouble finding a good source and wound up making the regex myself. To save whoever may find this time,
If you're looking for a ~standalone~ regex
This will match the extension without the dot
This will always match the file name if it has an extention
There are a few bugs with these patterns. Specifically, | and + don't work inside character classes ( [] ).
Ok, I am not sure why I would use regular expression for this. If I know for example that the string is a full filepath, then I would use another API to get the file name. Regular expressions are very powerfull but at the same time quite complex (you have just proved that by asking how to create such a simple regex). Somebody said: you had a problem that you decided to solve it using regular expressions. Now you have two problems.
Well, that's not much fun, is it? Anyway, adjusted the question to your answer, please see above. Thanks.
I used this pattern for simple search:
It finds fileext in the second and last lines.
I applied it in a text tree view of a folder (with spaces as indents).
Just the name of the file, without path and suffix.
Captures just the filename of any kind within an entire filepath. Purposefully excludes the file path and the file extension
9 Answers 9
Just for completeness: How could this be achieved without Regular Expressions?
The || input takes care of the case, where lastIndexOf() provides a -1 . You see, it's still a one-liner.
50 years in the future, when file names are Mb's long, people will look up to you like a god. I mean people, not IE users.
Result will be in that first capture group. However, it's probably more efficient to just find the position of the rightmost period and then take everything before it, without using regex.
Also think about things like a.longthingrighthereattheend or .ext & file. . Perhaps check with /(.*)\.[^.]<1,10>$/ . Actually, just use pathinfo() .1,10>
An almost perfect solution but, if you want to avoid the trap of filenames like .htaccess (starts with a period, but has no extension), as exemplified by Roger Pate, just substitute the first asterisk by a plus signal, as follows: (.+)\.[^.]+$
Test cases where this works and others fail:
- ".htaccess" (leading period)
- "file" (no file extension)
- "send to mrs." (no extension, but ends in abbr.)
- "version 1.2 of project" (no extension, yet still contains a period)
The common thread above is, of course, "malformed" file extensions. But you always have to think about those corner cases. :P
Test cases where this fails:
- "version 1.2" (no file extension, but "appears" to have one)
- "name.tar.gz" (if you view this as a "compound extension" and wanted it split into "name" and ".tar.gz")
How to handle these is problematic and best decided on a project-specific basis.
The regular expression to match the pattern is:
It finds a period character (\.), followed by 0 or more characters that are not periods ([^.]*), followed by the end of the string ($).
@AndreasGrech well, regexes don't remove things. They match things. If you use a program like SED, then to remove it you match it and replace it with empty string. Of course other option is to match all that is not the extension.
It is a simple and reasonable solution, but it fails in some exceptions given by Roger Pate, e.g. • send to mrs. • version 1.2 of project A more precise version of this code would be: \.[^(\.|\s)]+$
Here's my tested regexp solution.
The pattern will match filenameNoExt with/without extension in the path, respecting both slash and backslash separators
dissection of the above pattern:
This will cover all cases that was mentioned by @RogerPate but including full paths too
Not the answer you're looking for? Browse other questions tagged regex syntax or ask your own question.
Linked
Related
Hot Network Questions
To subscribe to this RSS feed, copy and paste this URL into your RSS reader.
Site design / logo © 2022 Stack Exchange Inc; user contributions licensed under cc by-sa. rev 2022.5.9.42071
что, конечно, работает только если имя файла имеет одно расширение. Но если это так . --2--> Я хочу adfadsfads.blah . Как я могу сделать это с regex?
что касается вопроса Дэвида, "почему вы используете regex" для этого, ответ: "для удовольствия.- На самом деле я использую простой код!--5-->
но мне нравится изучать регулярное выражение, когда это возможно, потому что это всегда появляется на коктейльных вечеринках Geek.
- захват имен файлов, которые начинаются с точки (например,".журналы" файл ".logs", а не расширение файла), которое распространено в Unix.
- получает все, кроме последней точки: "foo.бар.jpg "gets you" foo.бар."
- обрабатывает файлы без точки: "секретное письмо" получает "секретное письмо".
Примечание: как предложил комментатор j_random_hacker, это выполняется как объявлено, но возможно, вы захотите предшествовать вещам с якорем для целей читаемости.
все, за которым следует точка, за которой следует один или несколько символов, которые не являются точкой, а затем конец строки:
все-до последней точки сгруппированы для облегчения поиска.
Если вы не на 100% уверен, что каждый файл будет иметь расширение, попробовать:
Как насчет 2 захватывает один для конца и один для имени файла.
- получает путь без последнего \
- файл без расширения
- расширение с .
не поддерживает несколько . в имя файла Поддерживает . в пути к файлу
хорошо, я не уверен, почему я буду использовать регулярное выражение для этого. Если я знаю, например, что строка является полным путем к файлу, я бы использовал другой API для получения имени файла. Регулярные выражения очень мощные, но в то же время довольно сложные (Вы только что доказали это, спросив, как создать такое простое регулярное выражение). Кто-то сказал: У вас была проблема, которую вы решили решить с помощью регулярных выражений. Теперь у вас две проблемы.
я использовал этот шаблон для простого поиска:
находит fileext во второй и последней строках.
Я применил его в виде текстового дерева папки (с пробелами в виде отступов).
Мне нужно извлечь только имя файла (без расширения файла) следующий путь.
этот regex была испытана на эти два примера:
первый блок "(.+ \ ) * "соответствует пути к каталогу.
Второй блок.(" +)" соответствует имени файла без расширения.
Третий блок.(" +)$" соответствует расширению.
Это получит имя файла, но также получит точку. Возможно, вы захотите усечь последнюю цифру из него в своем коде.
обновление
@Geoman если у вас есть пробелы в имени файла, используйте измененный шаблон ниже
он соответствует всему, кроме задней косой черты, за которой следует .pdf в конце строки.
вы также можете (и, возможно, это даже лучше) принять участие, которое вы хотите в группе захвата, как это:
но то, как вы ссылаетесь на эту группу (часть в скобках), зависит от языка или вкуса regexp, который вы используете. В большинстве случаев это будет smth like или , или библиотека предоставит некоторые способ получения группы захвата по ее номеру после соответствия регулярному выражению.
Если кто-то ищет Windows абсолютный путь (и относительный путь) регулярное выражение javascript в javascript для файлов:
это всего лишь небольшая вариация на @hmd, поэтому вам не нужно усекать .
действительно, спасибо @hmd. Я только немного улучшил его.
вот небольшая модификация отличного ответа Анджело, которая позволяет использовать пробелы в пути, имени файла и расширения, а также отсутствующие части:
вот альтернатива, которая работает на windows / unix:
первый блок: путь
Второй блок: манекен
Третий блок: имя файла
Четвертый блок: расширение
это регулярное выражение извлекает расширение файла, если группа 3 не равна null, это расширение.
также еще один для файла в dir и root
для файла в dir
для файла в root
для большинства случаев (то есть некоторые win , unx путь , разделитель , голое имя файла , точка , расширение файла ) достаточно следующего:
Мне нужно регулярное выражение, которое может удалить расширение из имени файла, возвращает только имя файла.
вот несколько примеров входов и выходов:
Я, очевидно, могу сделать это вручную (т. е. удалить все из последней точки), но я уверен, что есть регулярное выражение, которое может сделать это само по себе.
просто для записи, я делаю это в JavaScript
результат будет в этой первой группе захвата. Однако, вероятно, более эффективно просто найти позицию самого правого периода, а затем взять все перед ним, не используя regex.
просто для полноты: как это может быть достигнуто без регулярных выражений?
на || input заботится о случае, где lastIndexOf() предоставляет -1 . Видите ли, это все еще одна линия.
тестовые случаи, когда это работает, а другие терпят неудачу:
- ".htaccess " (ведущий период)
- " file "(без расширения файла)
- "пошлите к миссис". (без расширения, но заканчивается на abbr.)
- "версия 1.2 проекта" (без расширения, но все еще содержит период)
общий поток выше, конечно," деформированные " расширения файлов. Но вы всегда должны думать о тех случаях. : P
тестовые случаи где это не удается:
- " версия 1.2 "(нет расширения файла, но "кажется", чтобы иметь один)
- "имя.смола.gz "(если вы рассматриваете это как "составное расширение" и хотите, чтобы оно разделилось на "имя" и ".смола.gz")
вот мое протестированное решение regexp.
шаблон будет соответствовать filenameNoExt с / без расширения в пути, уважая как косую черту, так и обратную косую черту сепараторы
препарирование вышеуказанной картины:
это будет охватывать все случаи, которые были упомянуты @RogerPate, но включая полные пути тоже
регулярное выражение для соответствия шаблону:
он находит символ точки (\.), за которым следует 0 или более символов, не являющихся периодами ([^.]*), за которым следует конец строки ($).
еще один способ без регулярных выражений "oposite" или версия Рауля (не используя pop () для удаления)
не требуется дважды ссылаться на переменную, поэтому проще встроить
Это также сделает это:)
Я бы придерживался регулярного выражения. =P
это сделает ваше желание сбудется. Но не регулярное выражение.
в javascript вы можете вызвать метод Replace (), который будет заменять на основе регулярного выражения.
это регулярное выражение будет соответствовать все от начала строки до конца и удалить все после последнего периода, включая период.
I am in need of a regular expression that can remove the extension of a filename, returning only the name of the file.
Here are some examples of inputs and outputs:
I can obviously do this manually (ie removing everything from the last dot) but I'm sure that there is a regular expression that can do this by itself.
Just for the record, I am doing this in JavaScript
Читайте также: