Регулярные выражения проверка пути
От: Аноним  
Дата: 17.01.14 08:56
Оценка:
Здравствуйте.

надо проверить полный путь регулярным выражением
правило именования имен и каталогов:
1. Длина имени — не более 8 символов
2. Длина расширения — не более 3 символов
3. Имена могут содержать только буквы и цифры

набросал вот так

^[a-zA-Z]+:(\\([a-zA-Z0-9]){1,8}\.([a-zA-Z0-9]){0,3}){1,}\\?$


то есть сначало [a-zA-Z] один или более раз (имя диска)
потом двоеточие
затем один или более раз повторяется (\\([a-zA-Z0-9]){1,8}\.([a-zA-Z0-9]){0,3})
и в конце может быть слеш — ноль или один раз



(\\([a-zA-Z0-9]){1,8}\.([a-zA-Z0-9]){0,3}) — но как тут убрать точку если расширение пустое?
Re: Регулярные выражения проверка пути
От: achp  
Дата: 17.01.14 09:04
Оценка:
Здравствуйте, Аноним, Вы писали:

А>(\\([a-zA-Z0-9]){1,8}\.([a-zA-Z0-9]){0,3}) — но как тут убрать точку если расширение пустое?


(\\([a-zA-Z0-9]){1,8}(\.([a-zA-Z0-9]){1,3})?)


Непонятно только, какое отношение это имеет к Си/Си++.
Re: Регулярные выражения проверка пути
От: jazzer Россия Skype: enerjazzer
Дата: 17.01.14 09:09
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Здравствуйте.


А>надо проверить полный путь регулярным выражением


В этот момент неплохо бы уточнить, какой из стандартов регэкспов имеется в виду — а то они сильно разные все

А>правило именования имен и каталогов:

А>1. Длина имени — не более 8 символов
А>2. Длина расширения — не более 3 символов
А>3. Имена могут содержать только буквы и цифры

А>набросал вот так


А>^[a-zA-Z]+\\([a-zA-Z0-9]){1,8}\.([a-zA-Z0-9]){0,3}){1,}\\?$


"{1,}" и "+" — это одно и то же (ну и чтоб два раза не вставать, "{0,}" и "*", "{0,1}" и "?")
вместо [a-zA-Z0-9] можно писать [:alnum:]] — более наглядно
и скобки вокруг [a-zA-Z0-9] не нужны

А>то есть сначало [a-zA-Z] один или более раз (имя диска)

А>потом двоеточие
А>затем один или более раз повторяется (\\([a-zA-Z0-9]){1,8}\.([a-zA-Z0-9]){0,3})
А>и в конце может быть слеш — ноль или один раз

А>(\\([a-zA-Z0-9]){1,8}\.([a-zA-Z0-9]){0,3}) — но как тут убрать точку если расширение пустое?


Надо объединить точку и непустое расширение в отдельную опциональную группу:
(\.[a-zA-Z0-9]{1,3})?
Ну и если есть незахватывающие группы, то используй их:
(?:\.[a-zA-Z0-9]{1,3})?
jazzer (Skype: enerjazzer) Ночная тема для RSDN
Автор: jazzer
Дата: 26.11.09

You will always get what you always got
  If you always do  what you always did
Re: Регулярные выражения проверка пути
От: Кодт Россия  
Дата: 17.01.14 09:43
Оценка:
Здравствуйте, Аноним, Вы писали:

А>надо проверить полный путь регулярным выражением

А>правило именования имен и каталогов:
А>1. Длина имени — не более 8 символов
А>2. Длина расширения — не более 3 символов
А>3. Имена могут содержать только буквы и цифры

А точно нужно 8.3-формат из букв и цифр, всякие там минусы и тильды запрещены?
А точно нужно регекспом, или может, стоит посмотреть на WinAPI (начиная от PathIsLFNFileSpec и GetShortPathName ?
(Понятно, что именно эти функции не решают именно эту поставленную задачу, но, возможно, они решают ту задачу, из которой возникла эта?)


А>(\\([a-zA-Z0-9]){1,8}\.([a-zA-Z0-9]){0,3}) — но как тут убрать точку если расширение пустое?


Так и убрать: сделать ветвление "точка и до трёх букв, или вообще ничего" [:alnum:]{1,8} ( | \.[:alnum:]{0,3} )
Имя файла, кстати, тоже может быть пустым, — правда, не в формате 8.3
http://files.rsdn.org/4783/catsmiley.gif Перекуём баги на фичи!
Re[2]: Регулярные выражения проверка пути
От: IsWin _
Дата: 17.01.14 09:43
Оценка:
Здравствуйте, jazzer, Вы писали:

J>Здравствуйте, Аноним, Вы писали:


А>>Здравствуйте.


А>>надо проверить полный путь регулярным выражением


J>В этот момент неплохо бы уточнить, какой из стандартов регэкспов имеется в виду — а то они сильно разные все


я не знаю :)

в Visual Studio 2010 :)

std::regex rx("^[a-zA-Z]+:(\\\\([a-zA-Z0-9]){1,8}\\.([a-zA-Z0-9]){0,3}){1,}\\\\?$");
std::cmatch mr;
std::regex_search(n.c_str(), mr, rx);
if(!mr.prefix().matched) throw std::exception("Invalid path or file name.");
Re[2]: Регулярные выражения проверка пути
От: IsWin _
Дата: 17.01.14 09:46
Оценка:
Здравствуйте, jazzer, Вы писали:

J>Здравствуйте, Аноним, Вы писали:


А>>Здравствуйте.


А>>надо проверить полный путь регулярным выражением


J>В этот момент неплохо бы уточнить, какой из стандартов регэкспов имеется в виду — а то они сильно разные все


А>>правило именования имен и каталогов:

А>>1. Длина имени — не более 8 символов
А>>2. Длина расширения — не более 3 символов
А>>3. Имена могут содержать только буквы и цифры

А>>набросал вот так


А>>^[a-zA-Z]+:(\\([a-zA-Z0-9]){1,8}\.([a-zA-Z0-9]){0,3}){1,}\\?$


J>"{1,}" и "+" — это одно и то же (ну и чтоб два раза не вставать, "{0,}" и "*", "{0,1}" и "?")

J>вместо [a-zA-Z0-9] можно писать [:alnum:]] — более наглядно
J>и скобки вокруг [a-zA-Z0-9] не нужны

А>>то есть сначало [a-zA-Z] один или более раз (имя диска)

А>>потом двоеточие
А>>затем один или более раз повторяется (\\([a-zA-Z0-9]){1,8}\.([a-zA-Z0-9]){0,3})
А>>и в конце может быть слеш — ноль или один раз

А>>(\\([a-zA-Z0-9]){1,8}\.([a-zA-Z0-9]){0,3}) — но как тут убрать точку если расширение пустое?


J>Надо объединить точку и непустое расширение в отдельную опциональную группу:

J>(\.[a-zA-Z0-9]{1,3})?
J>Ну и если есть незахватывающие группы, то используй их:
J>(?:\.[a-zA-Z0-9]{1,3})?

то есть прям так и написать? — (\.[a-zA-Z0-9]{1,3})?
т.е. ^[a-zA-Z]+:(\\[a-zA-Z0-9]{1,8}(\.[a-zA-Z0-9]{1,3})?){1,}\\?$
а {1,3} а не {0,3} ?
Re[2]: Регулярные выражения проверка пути
От: IsWin _
Дата: 17.01.14 09:48
Оценка:
Здравствуйте, Кодт, Вы писали:

К>Здравствуйте, Аноним, Вы писали:


А>>надо проверить полный путь регулярным выражением

А>>правило именования имен и каталогов:
А>>1. Длина имени — не более 8 символов
А>>2. Длина расширения — не более 3 символов
А>>3. Имена могут содержать только буквы и цифры

К>А точно нужно 8.3-формат из букв и цифр, всякие там минусы и тильды запрещены?


да. 100 процентов
Re[3]: Регулярные выражения проверка пути
От: jazzer Россия Skype: enerjazzer
Дата: 17.01.14 09:51
Оценка:
Здравствуйте, IsWin, Вы писали:

А>>>(\\([a-zA-Z0-9]){1,8}\.([a-zA-Z0-9]){0,3}) — но как тут убрать точку если расширение пустое?


Не оверквоть.

J>>Надо объединить точку и непустое расширение в отдельную опциональную группу:

J>>(\.[a-zA-Z0-9]{1,3})?
J>>Ну и если есть незахватывающие группы, то используй их:
J>>(?:\.[a-zA-Z0-9]{1,3})?

IW>то есть прям так и написать? — (\.[a-zA-Z0-9]{1,3})?

IW>т.е. ^[a-zA-Z]+\\[a-zA-Z0-9]{1,8}(\.[a-zA-Z0-9]{1,3})?){1,}\\?$
IW>а {1,3} а не {0,3} ?

Я так понял, что ты хочешь следующее: либо точка+непустое расширение, либо ни точки, ни расширения, так? Если да, то это означает, что точка+непустое расширение является опциональной группой — поэтому вопросик и {1,3}.
jazzer (Skype: enerjazzer) Ночная тема для RSDN
Автор: jazzer
Дата: 26.11.09

You will always get what you always got
  If you always do  what you always did
Re[2]: Регулярные выражения проверка пути
От: jazzer Россия Skype: enerjazzer
Дата: 17.01.14 10:00
Оценка:
Здравствуйте, Кодт, Вы писали:

К>Так и убрать: сделать ветвление "точка и до трёх букв, или вообще ничего" [:alnum:]{1,8} ( | \.[:alnum:]{0,3} )

К>Имя файла, кстати, тоже может быть пустым, — правда, не в формате 8.3

[:alnum:] надо в дополнительные квадратные скобки брать, оно без них не бывает
эта гармошка работает только как мета-символ внутри селектора [], т.е., например, для 16-ричных (xdigit) можно написать [a-hA-H[:digit:]]

Ну и вместо ( | \.[:alnum:]]{0,3} ) идиоматичнее написать ( \.[:alnum:]]{0,3} )?
jazzer (Skype: enerjazzer) Ночная тема для RSDN
Автор: jazzer
Дата: 26.11.09

You will always get what you always got
  If you always do  what you always did
Re[3]: Регулярные выражения проверка пути
От: IsWin _
Дата: 17.01.14 10:20
Оценка:
Здравствуйте, jazzer, Вы писали:

J>Здравствуйте, Кодт, Вы писали:


К>>Так и убрать: сделать ветвление "точка и до трёх букв, или вообще ничего" [:alnum:]{1,8} ( | \.[:alnum:]{0,3} )

К>>Имя файла, кстати, тоже может быть пустым, — правда, не в формате 8.3

J>[:alnum:] надо в дополнительные квадратные скобки брать, оно без них не бывает :shuffle:

J>эта гармошка работает только как мета-символ внутри селектора [], т.е., например, для 16-ричных (xdigit) можно написать [a-hA-H[:digit:]]

J>Ну и вместо ( | \.[:alnum:]]{0,3} ) идиоматичнее написать ( \.[:alnum:]]{0,3} )?



сделал вот так

^[a-zA-Z]+:(\\[a-zA-Z0-9]{1,8}(\.[a-zA-Z0-9]{1,3})?)+\\?$

для std::regex_search("c:\\asdfghqw.qwe\\fds.dfg", mr, rx);

не находит, если путь только с первым уровнем то все нормально
Re: Регулярные выражения проверка пути
От: IsWin _
Дата: 17.01.14 10:33
Оценка:
вот

std::regex rx("^[a-zA-Z]+:(\\\\[a-zA-Z0-9]{1,8}(\\.[a-zA-Z0-9]{1,3})?)+\\\\?$");

std::cmatch mr;

std::regex_search("c:\\asdfghqw.qwe\\fds.dfg", mr, rx);

std::cout << "prefix: matched == " << std::boolalpha
<< mr.prefix().matched << std::endl;


не находит, когда путь содержит только 1 уровень то все правильно обрабатываетса (в т.ч. и без расширения)
Re[2]: Регулярные выражения проверка пути
От: IsWin _
Дата: 17.01.14 13:18
Оценка:
Здравствуйте, IsWin, Вы писали:

IW>вот


IW> std::regex rx("^[a-zA-Z]+:(\\\\[a-zA-Z0-9]{1,8}(\\.[a-zA-Z0-9]{1,3})?)+\\\\?$");


IW> std::cmatch mr;


IW> std::regex_search("c:\\asdfghqw.qwe\\fds.dfg", mr, rx);


IW> std::cout << "prefix: matched == " << std::boolalpha

IW> << mr.prefix().matched << std::endl;


IW>не находит, когда путь содержит только 1 уровень то все правильно обрабатываетса (в т.ч. и без расширения)



Странно
не работает хотя должно
что бы тут попробовать
Re[4]: Регулярные выражения проверка пути
От: jazzer Россия Skype: enerjazzer
Дата: 17.01.14 13:56
Оценка:
Здравствуйте, IsWin, Вы писали:

IW>сделал вот так


IW>^[a-zA-Z]+\\[a-zA-Z0-9]{1,8}(\.[a-zA-Z0-9]{1,3})?)+\\?$


IW>для std::regex_search("c:\\asdfghqw.qwe\\fds.dfg", mr, rx);


IW>не находит, если путь только с первым уровнем то все нормально



попробуй удвоить все обратные косые черты. У тебя ведь сначала сишная строка, а потом уже регэксп. А в сишной строке обратная косая черта — это спецсимвол, и "\." не бывает — надо писать "\\."

Либо, если позволяет компилятор (что вряд ли), используй raw literals.
jazzer (Skype: enerjazzer) Ночная тема для RSDN
Автор: jazzer
Дата: 26.11.09

You will always get what you always got
  If you always do  what you always did
Re[5]: Регулярные выражения проверка пути
От: IsWin _
Дата: 17.01.14 14:47
Оценка:
Здравствуйте, jazzer, Вы писали:

J>Здравствуйте, IsWin, Вы писали:


IW>>сделал вот так


IW>>^[a-zA-Z]+:(\\[a-zA-Z0-9]{1,8}(\.[a-zA-Z0-9]{1,3})?)+\\?$


IW>>для std::regex_search("c:\\asdfghqw.qwe\\fds.dfg", mr, rx);


IW>>не находит, если путь только с первым уровнем то все нормально



J>попробуй удвоить все обратные косые черты. У тебя ведь сначала сишная строка, а потом уже регэксп. А в сишной строке обратная косая черта — это спецсимвол, и "\." не бывает — надо писать "\\."


J>Либо, если позволяет компилятор (что вряд ли), используй raw literals.





так и сделано
вот код

std::regex rx("^[a-zA-Z]+:(\\\\[a-zA-Z0-9]{1,8}(\\.[a-zA-Z0-9]{1,3})?)+\\\\?$");

std::cmatch mr;

std::regex_search("c:\\asdfghqw.qwe\\fds.dfg", mr, rx);

std::cout << "prefix: matched == " << std::boolalpha
<< mr.prefix().matched << std::endl;
Re[6]: Регулярные выражения проверка пути
От: IsWin _
Дата: 17.01.14 14:51
Оценка:
не работает
только с первым уровнем c:\dkfhvkdfj.dfj
если c:\dlkfv.df\hggh.eef — то уже нет

вот мануал что умеет regex в vs2010 http://msdn.microsoft.com/en-us/library/bb982727(v=vs.100).aspx , но там вроде бы тоже самое написано
Re[7]: Регулярные выражения проверка пути
От: jazzer Россия Skype: enerjazzer
Дата: 17.01.14 15:40
Оценка:
Здравствуйте, IsWin, Вы писали:

IW>не работает

IW>только с первым уровнем c:\dkfhvkdfj.dfj
IW>если c:\dlkfv.df\hggh.eef — то уже нет

IW>вот мануал что умеет regex в vs2010 http://msdn.microsoft.com/en-us/library/bb982727(v=vs.100).aspx , но там вроде бы тоже самое написано


dkfhvkdfj — это 9 символов, вообще-то

я проверил вот тут — все работает, с разными вариантами:
http://regexpal.com/

Может быть, баг в реализации регэкспов
Либо у тебя со опциями поиска что-то не так
Попробуй еще регэксп упростить, например, убрать якоря на начало/конец строки и т.п., пока не начнет матчить все, что тебе надо, а потом постепенно добавляй ограничения
jazzer (Skype: enerjazzer) Ночная тема для RSDN
Автор: jazzer
Дата: 26.11.09

You will always get what you always got
  If you always do  what you always did
Re[8]: Регулярные выражения проверка пути
От: IsWin _
Дата: 17.01.14 19:04
Оценка:
Здравствуйте, jazzer, Вы писали:

J>Здравствуйте, IsWin, Вы писали:


IW>>не работает

IW>>только с первым уровнем c:\dkfhvkdfj.dfj
IW>>если c:\dlkfv.df\hggh.eef — то уже нет

IW>>вот мануал что умеет regex в vs2010 http://msdn.microsoft.com/en-us/library/bb982727(v=vs.100).aspx , но там вроде бы тоже самое написано


J>dkfhvkdfj — это 9 символов, вообще-то :shuffle:


пардон имелос ввиду 8 символов
J>я проверил вот тут — все работает, с разными вариантами:
J>http://regexpal.com/

J>Может быть, баг в реализации регэкспов

J>Либо у тебя со опциями поиска что-то не так
J>Попробуй еще регэксп упростить, например, убрать якоря на начало/конец строки и т.п., пока не начнет матчить все, что тебе надо, а потом постепенно добавляй ограничения
сейчас накачу все обновления посмотрю
Re[9]: Регулярные выражения проверка пути
От: IsWin _
Дата: 18.01.14 11:15
Оценка:
Здравствуйте, IsWin, Вы писали:

IW>Здравствуйте, jazzer, Вы писали:


J>>Здравствуйте, IsWin, Вы писали:


IW>>>не работает

IW>>>только с первым уровнем c:\dkfhvkdfj.dfj
IW>>>если c:\dlkfv.df\hggh.eef — то уже нет

IW>>>вот мануал что умеет regex в vs2010 http://msdn.microsoft.com/en-us/library/bb982727(v=vs.100).aspx , но там вроде бы тоже самое написано


J>>dkfhvkdfj — это 9 символов, вообще-то :shuffle:


IW>пардон имелос ввиду 8 символов

J>>я проверил вот тут — все работает, с разными вариантами:
J>>http://regexpal.com/

J>>Может быть, баг в реализации регэкспов

J>>Либо у тебя со опциями поиска что-то не так
J>>Попробуй еще регэксп упростить, например, убрать якоря на начало/конец строки и т.п., пока не начнет матчить все, что тебе надо, а потом постепенно добавляй ограничения
IW>сейчас накачу все обновления посмотрю


неработает (блеа)
^ и $ пробовал убирать чепуха какая то воопще получаетса
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.