Regular expression functions (regexp_match, regexp_replace) in PostgreSQL - Time & Space Complexity
When using regular expression functions in PostgreSQL, it's important to understand how the time to run these functions changes as the input grows.
We want to know how the work done by these functions scales with the size of the text they process.
Analyze the time complexity of the following PostgreSQL code using regular expressions.
SELECT regexp_replace(text_column, 'pattern', 'replacement')
FROM large_table;
SELECT regexp_match(text_column, 'pattern')
FROM large_table;
This code replaces or matches patterns in a text column for many rows in a table.
Look for repeated work inside the query.
- Primary operation: Applying the regular expression to each text value.
- How many times: Once per row in the table, so it repeats for every row.
The time to process grows with both the number of rows and the length of each text.
| Input Size (n) | Approx. Operations |
|---|---|
| 10 rows, short text | Small, quick processing |
| 100 rows, medium text | About 10 times more work than 10 rows |
| 1000 rows, long text | Much more work, grows with text length and rows |
Pattern observation: More rows mean more repeated work, and longer text means more work per row.
Time Complexity: O(n * m)
This means the time grows with the number of rows (n) times the length of the text (m) processed by the regular expression.
[X] Wrong: "Regular expression functions always run in constant time regardless of input size."
[OK] Correct: The time depends on how long the text is and how many rows you process, so it grows as input grows.
Understanding how regular expression functions scale helps you write efficient queries and explain performance in real projects.
"What if we used a simpler pattern that matches faster? How would that affect the time complexity?"
Practice
regexp_match('abc123', '\\d+') return?Solution
Step 1: Understand regexp_match function
The function searches the input string for the first substring matching the pattern.Step 2: Apply pattern '\\d+' to 'abc123'
The pattern '\\d+' matches one or more digits. In 'abc123', '123' matches.Final Answer:
An array with the first sequence of digits found: ['123'] -> Option DQuick Check:
regexp_match returns first match array [OK]
- Thinking regexp_match returns the whole string
- Expecting a string instead of an array
- Confusing regexp_match with regexp_replace
regexp_replace in PostgreSQL?Solution
Step 1: Understand regexp_replace parameters
regexp_replace(text, pattern, replacement, flags) replaces matching parts. To replace all matches, use flag 'g'.Step 2: Choose pattern and flags to replace all digits
Pattern '\\d+' matches one or more digits. Flag 'g' ensures all digit sequences replaced, not just first.Final Answer:
regexp_replace('abc123def', '\\d+', '#', 'g') -> Option AQuick Check:
Use 'g' flag to replace all matches [OK]
- Omitting 'g' flag replaces only first match
- Using '\\d' without 'g' replaces only one digit
- Confusing pattern syntax with wrong brackets
SELECT regexp_match('user_2023_data', 'user_(\\d{4})_data');Solution
Step 1: Analyze the pattern 'user_(\\d{4})_data'
The pattern looks for 'user_' followed by exactly 4 digits (captured), then '_data'.Step 2: Match pattern against 'user_2023_data'
The string matches perfectly, capturing '2023' as the group.Final Answer:
['2023'] -> Option CQuick Check:
Captured group returns ['2023'] [OK]
- Expecting full string instead of captured group
- Not escaping backslashes properly
- Confusing regexp_match with regexp_replace output
SELECT regexp_replace('abc123def', '\\d+', '#');It is intended to replace all digit sequences with '#'.
Solution
Step 1: Understand regexp_replace behavior without flags
Without 'g' flag, regexp_replace replaces only the first match.Step 2: Check the pattern and replacement
Pattern '\\d+' is valid and replacement '#' is correct. Only missing 'g' flag causes partial replacement.Final Answer:
Missing 'g' flag, so only first digit sequence replaced -> Option BQuick Check:
Use 'g' flag to replace all matches [OK]
- Assuming all matches replaced without 'g'
- Thinking pattern syntax is wrong
- Using single quotes incorrectly for replacement
regexp_match. Which query correctly extracts 'example'?Solution
Step 1: Understand regexp_match returns array of groups
regexp_match returns an array with captured groups. To get the domain, access first element [1].Step 2: Check pattern '@([\\w]+)\\.com'
This pattern captures word characters after '@' and before '.com', which is the domain.Final Answer:
SELECT (regexp_match('user@example.com', '@([\\w]+)\\.com'))[1]; -> Option AQuick Check:
Access first group from regexp_match array [OK]
- Not accessing array element from regexp_match
- Using regexp_replace without global flag incorrectly
- Confusing pattern syntax for domain extraction
Ready to prove it?
Pass the test and this pattern moves unknown
