PowerShell - оператор соответствия и несколько групп

  1. Форматирование является способом “.NET” сделать его. Определенные инструменты рефакторинга (Осуществляют рефакторинг! для одного), даже предложит осуществить рефакторинг код concat-стиля для использования стиля форматирования.
  2. Форматирование легче оптимизировать для компилятора (хотя второе, вероятно, будет пересмотрено для использования метода 'Concat', который быстр).
  3. Форматирование является обычно более четким читать (особенно с форматированием “fancy”).
  4. Форматирование значит неявные вызовы для '.ToString' на всех переменных, который хорош для удобочитаемости.
  5. Согласно “Effective C#”.NET 'WriteLine' и реализации 'Формата' испорчена, они автоупаковывают все типы значения (который плох). “Effective C#” советует для выполнения '.ToString' вызовы явно, который, по моему скромному мнению, является поддельным (см. Jeff отправлять )
  6. В данный момент, форматирующие подсказки типа не проверяются компилятором, приводящим к ошибкам периода выполнения. Однако это могло быть исправлено в будущих версиях.
11
задан Eric Schoonover 9 November 2009 в 19:07
поделиться

4 ответа

You can do this with the Select-String cmdlet in V2 but you need to specify the -AllMatches switch e.g.:

$formattedMessage | Select-String 'regexpattern' -AllMatches

Keep in mind that with the -match operator the primary thing you are doing is looking for "a" match i.e. is the regex pattern matched or not.

9
ответ дан 3 December 2019 в 03:52
поделиться

Мне удалось получить все группы, определив Regex и затем вызвав .Matches для этого Regex. Все еще любопытно узнать, можно ли это сделать с помощью оператора -match в PowerShell.

$detailRegex = [regex]"(Get\sClient\sModel|Parse\sExpression|Get\sAbstract\sQuery|Compile\sQuery|Execute\sQuery|Get\sQuery\sPlan\sComplexity|Async\sTotal|Total)\s-\sduration\(([0-9]*)"
$detailRegex.Matches($formattedMessage)
9
ответ дан 3 December 2019 в 03:52
поделиться

Оператор -match предназначен для использования только один раз; он не выполняет глобального сопоставления на входе. Кейт Хилл предложил использовать оператор -matchall в Microsoft connect здесь .

Я предлагаю другой способ сделать это. Если запись журнала находится в файле, вы можете использовать оператор switch для выполнения той же задачи:

switch -regex -file .\log.txt { $entryRegex { $matches[1] + ", " + $matches[2] } }

Это результат, который я получаю с помощью этого оператора, если $ entryRegex имеет определенное вами регулярное выражение:

Get Client Model, 0
Parse Expression, 0
Get Abstract Query, 0
Compile Query, 0
Execute Query, 63695
Get Query Plan Complexity, 0
Total, 63696
Async Total, 63696
4
ответ дан 3 December 2019 в 03:52
поделиться

http://www.johndcook.com/regex.html gives a decent example

And, by all means, simplify your expression:

^([^-]+)\s*-\s*duration\(([0-9]+)
  • start at the beginning of the line
  • capture all characters leading up to the first -
  • make sure there's a -
  • skip whitespace
  • make sure the word "duration(" exists
  • capture all digits after "duration("
4
ответ дан 3 December 2019 в 03:52
поделиться
Другие вопросы по тегам:

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