надо проверить полный путь регулярным выражением
правило именования имен и каталогов:
1. Длина имени — не более 8 символов
2. Длина расширения — не более 3 символов
3. Имена могут содержать только буквы и цифры
то есть сначало [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}) — но как тут убрать точку если расширение пустое?
Здравствуйте, Аноним, Вы писали:
А>Здравствуйте.
А>надо проверить полный путь регулярным выражением
В этот момент неплохо бы уточнить, какой из стандартов регэкспов имеется в виду — а то они сильно разные все
А>правило именования имен и каталогов: А>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})?
Здравствуйте, Аноним, Вы писали:
А>надо проверить полный путь регулярным выражением А>правило именования имен и каталогов: А>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
Здравствуйте, jazzer, Вы писали:
J>Здравствуйте, Аноним, Вы писали:
А>>Здравствуйте.
А>>надо проверить полный путь регулярным выражением
J>В этот момент неплохо бы уточнить, какой из стандартов регэкспов имеется в виду — а то они сильно разные все
Здравствуйте, 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} ?
Здравствуйте, Кодт, Вы писали:
К>Здравствуйте, Аноним, Вы писали:
А>>надо проверить полный путь регулярным выражением А>>правило именования имен и каталогов: А>>1. Длина имени — не более 8 символов А>>2. Длина расширения — не более 3 символов А>>3. Имена могут содержать только буквы и цифры
К>А точно нужно 8.3-формат из букв и цифр, всякие там минусы и тильды запрещены?
Здравствуйте, 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}.
Здравствуйте, Кодт, Вы писали:
К>Так и убрать: сделать ветвление "точка и до трёх букв, или вообще ничего" [:alnum:]{1,8} ( | \.[:alnum:]{0,3} ) К>Имя файла, кстати, тоже может быть пустым, — правда, не в формате 8.3
[:alnum:] надо в дополнительные квадратные скобки брать, оно без них не бывает
эта гармошка работает только как мета-символ внутри селектора [], т.е., например, для 16-ричных (xdigit) можно написать [a-hA-H[:digit:]]
Ну и вместо ( | \.[:alnum:]]{0,3} ) идиоматичнее написать ( \.[:alnum:]]{0,3} )?
Здравствуйте, 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} )?
Здравствуйте, 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, Вы писали:
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.
Здравствуйте, 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 , но там вроде бы тоже самое написано
Может быть, баг в реализации регэкспов
Либо у тебя со опциями поиска что-то не так
Попробуй еще регэксп упростить, например, убрать якоря на начало/конец строки и т.п., пока не начнет матчить все, что тебе надо, а потом постепенно добавляй ограничения
Здравствуйте, 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>Попробуй еще регэксп упростить, например, убрать якоря на начало/конец строки и т.п., пока не начнет матчить все, что тебе надо, а потом постепенно добавляй ограничения
сейчас накачу все обновления посмотрю
Здравствуйте, 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>сейчас накачу все обновления посмотрю
неработает (блеа)
^ и $ пробовал убирать чепуха какая то воопще получаетса