2013-03-15 7 views

ответ

14

еще один способ (по аналогии с @mjolinor способом) в одной строке:

([regex]::Matches($a, "<= goes here /")).count 
+0

Это не работает, если строка, которую вы пытаетесь сопоставить, является только одним символом r длинный. –

+0

Что вы делаете со специальными персонажами? Если ваша строка поиска содержит^\ | (и т. Д., Они должны быть экранированы. –

2

Вы можете использовать перегрузку метода [.NET String.Split][1], которая берет массив строковых объектов, а затем подсчитывает количество разрывов, которые вы получаете.

($a.Split([string[]]@('<= goes here /'),[StringSplitOptions]"None")).Count - 1 

Обратите внимание, что вы должны бросить Строка вашего поиска для на массив строк, чтобы убедиться, что вы получите правильный Split перегрузки, а затем вычесть 1 из результата, потому что раскол будет возвращать все строки, которые окружают вашу строку поиска , Также важна опция «Нет», которая заставит Split возвращать нулевые строки в массиве (который вы можете подсчитать), если ваша строка поиска вернется в начале или в конце.

3

Используя регулярное выражение:

$a = "blah test <= goes here/blah test <= goes here/blah blah" 
[regex]$regex = '<= goes here /' 
$regex.matches($a).count 
2 
2

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

$ExampleVar = "one|two|three|four|fivefive|six|seven"; 
$Occurrences = $ExampleVar.Split("|").GetUpperBound(0); 
Write-Output "I've found $Occurrences pipe(s) in your string, sir!"; 
  • Маркус
0

Просто расширить отличный ответ BeastianSTI»:

Нахождение максимального количества сепараторов, используемых в строке файла (строка неизвестно во время выполнения):

$myNewCount = 0 
foreach ($line in [System.IO.File]::ReadLines("Filename")){ 
    $fields = $line.Split("*").GetUpperBound(0); 
    If ($fields -gt $myNewCount) 
    {$myNewCount = $fields} 
} 
Смежные вопросы