Формат файла MSG задокументирован в https://msdn.microsoft.com/en-us/library/cc463912%28v=exchg.80%29.aspx?f=255&MSPPError=-2147217396 [110 ]
Если вы перемещаете элементы между серверами Exchange, рассмотрите формат Fast Transfer Stream (FTS) - используйте ExportItems и UploadItems Операции EWS.
Одна возможность состоит в том что предпоследнее .*
является жадным. Вы могли бы попытаться изменить его на:
.*(header_\d*_).*(_.*_.{8}).*?(\.\w{3,4})?.*
^ Added that
Это не было корректно, этот будет соответствовать входу, который Вы предоставили, но он предполагает что первое .
это встречается, запуск расширения файла:
.*(header_\d*_).*(_.*_.{8})[^\.]*(\.\w{3,4})?.*
Править: Удалите выход, который я имел во втором regex.
Я полагаю, что проблема находится в Вашем 3-м .*
, который Вы аннотировали выше, "Игнорируют что-либо между этим и расширением файла". Это жадно, таким образом, это будет соответствовать ЧЕМУ-ЛИБО. Когда Вы делаете дополнительный шаблон дополнительным, 3-е .*
совпадает в конец строки, которая позволяется. Предположение, что никогда не будет'.
'символ, в который посторонний бит, можно заменить .*
с [^.]*
и остальные будут, надо надеяться, работать после восстановления ?
то, что необходимо было удалить.
Ну, .*
вероятно, неправильный способ запустить regex-, которому он будет соответствовать 0 или больше (*
) отдельные символы чего-либо(.)..., что означает Ваше все имя файла, будут подобраны этим одним. Если Вы уедете, то это от regex начнет соответствовать, когда он достигнет header
который является тем, что Вы хотите. Вы могли также заменить его \w
, который соответствует разрывам слова. Я также предлагаю использовать инструмент, такой как тренер Regex, таким образом, можно ступить через него и видеть точно что случилось и каковы группы получения будут.
Вот тот, который работает на то, что Вы отправляете:
^.*(?<header>header_\d{10,11})_.*(?<date>_[a-z0-9]+_\d{8})(\[\d+\])(?<ext>(\.[a-zA-Z0-9]{3,4})?).*
Замена:
Header: $1
Date: $2
Extension: $4
Я не использовал именованные группы в замене, потому что я не мог выяснить, как заставить TextMate делать это, но именованные группы были полезны вызвать получение.
Укажите в своем втором соответствии, что Вы только хотите соответствовать всем символам, которые не имеют периода в них, затем делают Ваше соответствие для Вашего расширения.
".*(header_\d{10,11}_).*(_.*_\d{8})[^.]*(\.\w{3,4})?"
Это - Ваш корректный результат
.*?(header_\d*_).*?(_.*_.{8})[^.]*(\.\w{3,4})?.*
-------------------------------------------
.*? # Prevent a greedy match
(header_ #
\d{10,11}_) #
.*? # Prevent a greedy match
(_.*_\d{8}) #
[^.]* # Take everything that is NOT a period
(\.\w{3,4}) # Match the extension
.* #
Неявное предположение - то, что период будет началом расширения файла после соответствия цифр. Следующее не отвечало бы этому требованию:
string unmatched = "header_00000000076_d_al41zguyvgqfj2454jki5l55_20071203[1].foobar.txt"
Кроме того, когда вынимание Ваших групп в.NET удостоверяется, что Ваш код похож на это:
regex.Match(string_to_match).Groups[1].Value
regex.Match(string_to_match).Groups[2].Value
regex.Match(string_to_match).Groups[3].Value
и не это:
// 0 index == string_to_match
regex.Match(string_to_match).Groups[0].Value
regex.Match(string_to_match).Groups[1].Value
regex.Match(string_to_match).Groups[2].Value
Это - что-то, что сбило меня с толку сначала.
Это работает на примеры, которые Вы отправили:
^.*?(?<header>\d+)_.*?_(?<date>\d{8}).*?(?:\.(?<ext>\w{3,4}))?[\w\s\[\]]*$
Я предполагаю, что текст "заголовок" и случайные символы между этим и датой не важен, таким образом, они не получены этим regex. Я также использовал.NET, названную функцией получения ясности, но знать, что она не поддерживается в других разновидностях RegEx.
Если текст после имени файла содержит какие-либо неалфавитно-цифровые символы кроме [и], шаблон должен будет быть пересмотрен.