Как я могу указать необязательную группу захвата в этом регулярном выражении?

Формат файла 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.

5
задан EndangeredMassa 28 January 2009 в 18:26
поделиться

7 ответов

Одна возможность состоит в том что предпоследнее .* является жадным. Вы могли бы попытаться изменить его на:

.*(header_\d*_).*(_.*_.{8}).*?(\.\w{3,4})?.*
                             ^ Added that

Это не было корректно, этот будет соответствовать входу, который Вы предоставили, но он предполагает что первое . это встречается, запуск расширения файла:

.*(header_\d*_).*(_.*_.{8})[^\.]*(\.\w{3,4})?.*

Править: Удалите выход, который я имел во втором regex.

5
ответ дан 18 December 2019 в 10:49
поделиться

Я полагаю, что проблема находится в Вашем 3-м .*, который Вы аннотировали выше, "Игнорируют что-либо между этим и расширением файла". Это жадно, таким образом, это будет соответствовать ЧЕМУ-ЛИБО. Когда Вы делаете дополнительный шаблон дополнительным, 3-е .* совпадает в конец строки, которая позволяется. Предположение, что никогда не будет'.'символ, в который посторонний бит, можно заменить .* с [^.]* и остальные будут, надо надеяться, работать после восстановления ? то, что необходимо было удалить.

3
ответ дан 18 December 2019 в 10:49
поделиться

Ну, .* вероятно, неправильный способ запустить regex-, которому он будет соответствовать 0 или больше (*) отдельные символы чего-либо(.)..., что означает Ваше все имя файла, будут подобраны этим одним. Если Вы уедете, то это от regex начнет соответствовать, когда он достигнет header который является тем, что Вы хотите. Вы могли также заменить его \w, который соответствует разрывам слова. Я также предлагаю использовать инструмент, такой как тренер Regex, таким образом, можно ступить через него и видеть точно что случилось и каковы группы получения будут.

2
ответ дан 18 December 2019 в 10:49
поделиться

Вот тот, который работает на то, что Вы отправляете:

^.*(?<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 делать это, но именованные группы были полезны вызвать получение.

1
ответ дан 18 December 2019 в 10:49
поделиться

Укажите в своем втором соответствии, что Вы только хотите соответствовать всем символам, которые не имеют периода в них, затем делают Ваше соответствие для Вашего расширения.

".*(header_\d{10,11}_).*(_.*_\d{8})[^.]*(\.\w{3,4})?"
2
ответ дан 18 December 2019 в 10:49
поделиться

Это - Ваш корректный результат

.*?(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

Это - что-то, что сбило меня с толку сначала.

2
ответ дан 18 December 2019 в 10:49
поделиться

Это работает на примеры, которые Вы отправили:

^.*?(?<header>\d+)_.*?_(?<date>\d{8}).*?(?:\.(?<ext>\w{3,4}))?[\w\s\[\]]*$

Я предполагаю, что текст "заголовок" и случайные символы между этим и датой не важен, таким образом, они не получены этим regex. Я также использовал.NET, названную функцией получения ясности, но знать, что она не поддерживается в других разновидностях RegEx.

Если текст после имени файла содержит какие-либо неалфавитно-цифровые символы кроме [и], шаблон должен будет быть пересмотрен.

1
ответ дан 18 December 2019 в 10:49
поделиться
Другие вопросы по тегам:

Похожие вопросы: