Bird
Raised Fist0
PowerShellscripting~5 mins

String comparison (-like, -match) in PowerShell - Time & Space Complexity

Choose your learning style10 modes available
Time Complexity: String comparison (-like, -match)
O(n)
Understanding Time Complexity

When we compare strings using -like or -match in PowerShell, the time it takes depends on the length of the strings and the pattern.

We want to understand how the work grows as the strings get longer.

Scenario Under Consideration

Analyze the time complexity of the following code snippet.


$string = "HelloWorld"
$pattern = "Hello*"
if ($string -like $pattern) {
    Write-Output "Match found"
} else {
    Write-Output "No match"
}

This code checks if the string matches the pattern using the -like operator, which supports simple wildcard matching.

Identify Repeating Operations

Identify the loops, recursion, array traversals that repeat.

  • Primary operation: Comparing characters of the string to the pattern one by one.
  • How many times: Up to the length of the string or pattern, whichever is shorter.
How Execution Grows With Input

As the string or pattern gets longer, the comparison checks more characters.

Input Size (n)Approx. Operations
10About 10 character checks
100About 100 character checks
1000About 1000 character checks

Pattern observation: The work grows roughly in a straight line with the length of the string or pattern.

Final Time Complexity

Time Complexity: O(n)

This means the time to compare grows directly with the length of the string or pattern.

Common Mistake

[X] Wrong: "String comparison with -like or -match is always instant, no matter the string size."

[OK] Correct: The comparison checks characters one by one, so longer strings take more time.

Interview Connect

Understanding how string comparisons scale helps you write scripts that stay fast even with bigger data.

Self-Check

"What if we used -match with a complex regular expression instead of -like? How would the time complexity change?"

Practice

(1/5)
1. Which operator in PowerShell uses simple wildcard patterns for string comparison?
easy
A. -contains
B. -like
C. -match
D. -eq

Solution

  1. Step 1: Understand the purpose of -like

    The -like operator uses simple wildcard characters like * and ? to match patterns in strings.
  2. Step 2: Compare with -match

    The -match operator uses regular expressions, which are more complex than simple wildcards.
  3. Final Answer:

    -like -> Option B
  4. Quick Check:

    Simple wildcard matching = -like [OK]
Hint: Remember: -like = wildcards, -match = regex [OK]
Common Mistakes:
  • Confusing -like with -match
  • Thinking -contains works like -like
  • Assuming -eq supports wildcards
2. Which of the following is the correct syntax to check if the variable $name contains the substring 'John' using -like?
easy
A. $name -like 'John*'
B. $name -like 'John?'
C. $name -like '*John*'
D. $name -like '?John?'

Solution

  1. Step 1: Understand wildcard usage with -like

    The asterisk (*) wildcard matches zero or more characters. To check if 'John' appears anywhere, use '*John*'.
  2. Step 2: Analyze each option

    $name -like 'John*' checks if string starts with 'John'. $name -like '*John*' checks if 'John' is anywhere. $name -like '?John?' uses '?' which matches exactly one character, so it won't match 'John' alone. $name -like 'John?' checks if string starts with 'John' and has one more character.
  3. Final Answer:

    $name -like '*John*' -> Option C
  4. Quick Check:

    Substring anywhere = '*John*' [OK]
Hint: Use * before and after substring to match anywhere [OK]
Common Mistakes:
  • Forgetting to use * wildcards around substring
  • Using ? instead of * for multiple characters
  • Assuming -like matches exact substring without wildcards
3. What will be the output of this PowerShell code?
$text = 'PowerShell123'
if ($text -match '\d{3}$') { 'Ends with 3 digits' } else { 'No match' }
medium
A. Ends with 3 digits
B. No match
C. Syntax error
D. Empty output

Solution

  1. Step 1: Understand the regex pattern '\d{3}$'

    This pattern matches exactly three digits (\d{3}) at the end of the string ($).
  2. Step 2: Check the string 'PowerShell123'

    The string ends with '123', which is three digits, so the pattern matches.
  3. Final Answer:

    Ends with 3 digits -> Option A
  4. Quick Check:

    Regex matches end digits = 'Ends with 3 digits' [OK]
Hint: Use -match with regex to find patterns like digits [OK]
Common Mistakes:
  • Confusing -like with regex patterns
  • Not escaping backslash in regex
  • Assuming -match returns boolean instead of string output
4. Identify the error in this PowerShell snippet:
$file = 'report.doc'
if ($file -clike '*.DOC') { 'Match found' } else { 'No match' }
medium
A. -clike is case-sensitive, so '*.DOC' won't match 'report.doc'
B. Wildcard * is missing
C. Quotes around pattern are incorrect
D. Variable $file is not defined

Solution

  1. Step 1: Understand the -clike operator

    -clike is the case-sensitive counterpart to -like. It requires exact case matching for the pattern.
  2. Step 2: Analyze the mismatch

    The string 'report.doc' ends with lowercase '.doc', but the pattern '*.DOC' specifies uppercase '.DOC'. Other options are invalid: * is present, quotes are correct, $file is defined.
  3. Final Answer:

    -clike is case-sensitive, so '*.DOC' won't match 'report.doc' -> Option A
  4. Quick Check:

    Case mismatch with -clike = no match [OK]
Hint: Remember: -clike = case-sensitive, -like = case-insensitive [OK]
Common Mistakes:
  • Forgetting -clike is case-sensitive
  • Thinking wildcards are missing
  • Misunderstanding variable initialization
5. You want to filter a list of filenames to include only those that start with 'log' and end with a 4-digit year using PowerShell. Which command correctly uses -match to do this?
$files = @('log2020.txt', 'log2019.csv', 'data2020.log', 'log20a0.txt')
hard
A. $files | Where-Object { $_ -like 'log????' }
B. $files | Where-Object { $_ -like 'log*2020' }
C. $files | Where-Object { $_ -match 'log\d{4}$' }
D. $files | Where-Object { $_ -match '^log\d{4}' }

Solution

  1. Step 1: Understand the pattern requirements

    We want filenames starting with 'log' (^log) followed immediately by exactly 4 digits (\d{4}).
  2. Step 2: Analyze each option

    $files | Where-Object { $_ -match '^log\d{4}' } uses regex '^log\d{4}' which matches strings starting with 'log' plus 4 digits. $files | Where-Object { $_ -like 'log????' } uses -like with 'log????' which matches 'log' plus any 4 characters but not necessarily digits. $files | Where-Object { $_ -match 'log\d{4}$' } matches 'log' followed by 4 digits at the end, but the year is not necessarily at the end of the filename. $files | Where-Object { $_ -like 'log*2020' } matches 'log' followed by anything and ending with '2020', which is too specific.
  3. Final Answer:

    $files | Where-Object { $_ -match '^log\d{4}' } -> Option D
  4. Quick Check:

    Start with 'log' + 4 digits = $files | Where-Object { $_ -match '^log\d{4}' } [OK]
Hint: Use ^ for start and \d{4} for 4 digits in regex [OK]
Common Mistakes:
  • Using -like with ? instead of digits
  • Matching digits at end instead of start
  • Confusing -like and -match patterns
Recommended

Ready to prove it?

Pass the test and this pattern moves unknown strong while earning +1 Grip toward your certificate.

10 questions~5 mineasy hard