2016-11-04 3 views
0

Also machte ich meine Eingabe vom Lese-Host in ein Array und dachte, es würde mir die Anzahl der Male zählen, die ein Wort im Satz $ a von $ gesehen wird Array. Graf jedoch ++ gibt mir nicht insgesamtPowershell - Wie kann ich Zählvorkommen in meinem Array zählen

function Get-Sentence($a){ 
       if($a -contains $array) { 
        $Count++ 
       } 
      else { 
        return 0 
       } 
     } 
     Write-Host "There are $count words" 

     [array]$Array = @("a", "an", "the") 
     [array]$a = Read-Host "Enter a long sentence from a story book or novel: ").split(" ") 
+0

'-contains' nicht so funktioniert. Sie fragen, ob das geteilte Array das gesamte Array von Wörtern enthält, das Sie angegeben haben, was es offensichtlich nicht tut (es enthält Wörter, kein Array). Sie können das mit einer Schleife lösen oder effektiver, indem Sie Ihre Wortliste als Hash-Tabelle speichern und die Mitgliedschaft darin überprüfen. –

+0

Danke für Ihre schnelle Antwort, also sagen Sie, dass ich mein $ Array-Array in eine Hash-Tabelle verwandeln sollte? – SkullNerd

Antwort

2

Preferred Ansatz:

Die einfachste Weg, um genau das Auftreten von mehreren Teilen zählen ist wahrscheinlich:

  1. Baukonstruktion RegexMuster, die auf einem Spiel von die Teilzeichenfolgen
  2. Verwenden Sie den Operator -split, um die Zeichenfolge zu trennen
  3. Zählen Sie die resultierende Anzahl der Zeichenfolgen und subtrahieren 1:

# Define the substrings and a sentence to test against 
$Substrings = "a","an","the" 
$Sentence = "a long long sentence to test the -split approach, anticipating false positives" 

# Construct the regex pattern 
# The \b sequence ensures "word boundaries" on either side of a 
# match so that "a" wont match the a in "man" for example 
$Pattern = "\b(?:{0})\b" -f ($Substrings -join '|') 

# Split the string, count result and subtract 1 
$Count = ($Sentence -split $Pattern).Count - 1 

Ausgänge:

C:\> $Count 
2 

Wie Sie es auf "a" und "das" abgestimmt und Split haben wird sehen können, aber nicht die "eine" in "vorausschauend".

ich verlassen werde den Leser dieser in eine Funktion eine Übung Umwandlung


Hinweis: wenn Sie Fütterung mehr als nur einfache ASCII-Strings als Eingabe beginnen, sollten Sie sie entkommen, bevor sie in dem Muster mit:

$Pattern = "\b(?:{0})\b" -f (($Substrings |ForEach-Object {[regex]::Escape($_)}) -join '|') 

Naive Ansatz:

Wenn Sie mit regulären Ausdrücken nicht vertraut sind, können Sie davon ausgehen, dass alles zwischen zwei Leerzeichen "ein Wort" ist (wie in Ihrem ursprünglichen Beispiel), und dann die Wörter im Satz durchlaufen und prüfen, ob Array enthält die betreffende Wort (nicht umgekehrt):

$Substrings = "a","an","the" 
$Sentence = (Read-Host "Enter a long sentence from a story book or novel: ").Split(" ") 

$Counter = 0 

foreach($Word in $Sentence){ 
    if($Substrings -contains $Word){ 
     $Counter++ 
    } 
} 

Als suggested by Jeroen Mostert, können Sie auch eine HashTable nutzen. Damit könnten Sie Vorkommen jedes Wort verfolgen, statt nur eine Gesamtzahl:

$Substrings = "a","an","the" 
$Sentence = (Read-Host "Enter a long sentence from a story book or novel: ").Split(" ") 

# Create hashtable from substrings 
$Dictionary = @{} 
$Substrings |ForEach-Object { $Dictionary[$_] = 0 } 

foreach($Word in $Sentence){ 
    if($Dictionary.ContainsKey($Word)){ 
     $Dictionary[$Word]++ 
    } 
} 

$Dictionary 
+0

Vielen Dank für Ihre schnelle Antwort! Ich verstehe nicht, was im '" \ b (?: {0}) \ b "' Teil passiert. Kann ich es irgendwie so verwenden, wie mein Skript geschrieben ist? – SkullNerd

+0

@BartVanRooijen '\ b (?: sometext) \ b' ist ein Regular Expression-Muster - der '{0}' ist ein Platzhalter. Der Operator '-f' ersetzt' {0} 'durch das erste Argument auf der rechten Seite. Wenn Sie sagen "verwenden Sie es so, wie mein Skript geschrieben wird", was genau meinst du? Der '-contains' Operator zum Beispiel macht in diesem Zusammenhang keinen Sinn –

+0

Vielen Dank !! – SkullNerd

1
$Substrings = "a","an","the" 
    ("a long long sentence to test the -split approach, anticipating false positives" -split " " | where {$Substrings -contains $_}).Count 
Verwandte Themen