Skip to content

Commit

Permalink
Merge pull request #5677 from poorna2152/regex_find
Browse files Browse the repository at this point in the history
Add BBE for `Regexp` find operations
  • Loading branch information
poorna2152 authored Oct 25, 2024
2 parents ea62564 + 712dd87 commit fbe08d7
Show file tree
Hide file tree
Showing 5 changed files with 107 additions and 0 deletions.
7 changes: 7 additions & 0 deletions examples/index.json
Original file line number Diff line number Diff line change
Expand Up @@ -1223,6 +1223,13 @@
"verifyBuild": true,
"verifyOutput": true,
"isLearnByExample": true
},
{
"name": "RegExp find operations",
"url": "regexp-find-operations",
"verifyBuild": true,
"verifyOutput": true,
"isLearnByExample": true
}
]
},
Expand Down
63 changes: 63 additions & 0 deletions examples/regexp-find-operations/regexp_find_operations.bal
Original file line number Diff line number Diff line change
@@ -0,0 +1,63 @@
import ballerina/io;
import ballerina/lang.regexp;

public function main() returns error? {
string logContent = string `
2024-09-19 10:02:01 WARN [UserLogin] - Failed login attempt for user: johndoe
2024-09-19 10:03:17 ERROR [Database] - Connection to database timed out
2024-09-19 10:04:05 WARN [RequestHandler] - Response time exceeded threshold for /api/v1/users
2024-09-19 10:05:45 INFO [Scheduler] - Scheduled task started: Data backup
2024-09-19 10:06:10 ERROR [Scheduler] - Failed to start data backup: Permission denied
2024-09-19 10:11:55 INFO [Security] - Security scan completed, no issues found
2024-09-19 10:12:30 ERROR [RequestHandler] - 404 Not Found: /api/v1/products`;

// Regular expression to match error logs with three groups:
// 1. Timestamp (e.g., 2024-09-19 10:03:17).
// 2. Component (e.g., Database, Scheduler).
// 3. Log message (e.g., Connection to database timed out).
string:RegExp errorLogPattern = re `(\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}) ERROR \[(\w+)\]\s-\s(.*)`;

// Retrieve the first error log from `logContent`.
regexp:Span? firstErrorLog = errorLogPattern.find(logContent);
if firstErrorLog == () {
io:println("Failed to find a error log");
return;
}
io:println("First error log: ", firstErrorLog.substring());

// Retrieve all error logs from the `logContent`.
regexp:Span[] allErrorLogs = errorLogPattern.findAll(logContent);
io:println("\nAll error logs:");
foreach regexp:Span errorLog in allErrorLogs {
io:println(errorLog.substring());
}

// Retrieve groups (timestamp, component, message) from the first error log.
regexp:Groups? firstErrorLogGroups = errorLogPattern.findGroups(logContent);
if firstErrorLogGroups == () {
io:println("Failed to find groups in first error log");
return;
}
io:println("\nGroups within first error log:");
check printGroupsWithinLog(firstErrorLogGroups);

// Retrieve groups from all error logs.
regexp:Groups[] allErrorLogGroups = errorLogPattern.findAllGroups(logContent);
io:println("\nGroups in all error logs");
foreach regexp:Groups logGroup in allErrorLogGroups {
check printGroupsWithinLog(logGroup);
}
}

function printGroupsWithinLog(regexp:Groups logGroup) returns error? {
// The first element in the `logGroup` is the entire matched string.
// The subsequent elements in `logGroup` represent the captured groups
// (timestamp, component, message).
string timestamp = (check logGroup[1].ensureType(regexp:Span)).substring();
string component = (check logGroup[2].ensureType(regexp:Span)).substring();
string logMessage = (check logGroup[3].ensureType(regexp:Span)).substring();

io:println("Timestamp: ", timestamp);
io:println("Component: ", component);
io:println("Message: ", logMessage);
}
12 changes: 12 additions & 0 deletions examples/regexp-find-operations/regexp_find_operations.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
# RegExp find operations

The `RegExp` type provides a set of langlib functions to find patterns within strings. These functions enable efficient pattern matching, grouping, and extraction based on specific regular expressions.

::: code regexp_find_operations.bal :::

::: out regexp_find_operations.out :::

## Related links
- [RegExp type](/learn/by-example/regexp-type)
- [RegExp API Docs](https://lib.ballerina.io/ballerina/lang.regexp)
- [string API Docs](https://lib.ballerina.io/ballerina/lang.string)
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
description: This BBE demonstrates how to use the regexp langlib functions relevant to regex find operations.
keywords: ballerina, ballerina by example, bbe, regexp, RegExp, regex, regular expressions, ballerina regex functions, regexp langlib functions, find, findAll, findGroups, findAllGroups
23 changes: 23 additions & 0 deletions examples/regexp-find-operations/regexp_find_operations.out
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
$ bal run regexp_find_operations.bal
First error log: 2024-09-19 10:03:17 ERROR [Database] - Connection to database timed out

All error logs:
2024-09-19 10:03:17 ERROR [Database] - Connection to database timed out
2024-09-19 10:06:10 ERROR [Scheduler] - Failed to start data backup: Permission denied
2024-09-19 10:12:30 ERROR [RequestHandler] - 404 Not Found: /api/v1/products

Groups within first error log:
Timestamp: 2024-09-19 10:03:17
Component: Database
Message: Connection to database timed out

Groups in all error logs
Timestamp: 2024-09-19 10:03:17
Component: Database
Message: Connection to database timed out
Timestamp: 2024-09-19 10:06:10
Component: Scheduler
Message: Failed to start data backup: Permission denied
Timestamp: 2024-09-19 10:12:30
Component: RequestHandler
Message: 404 Not Found: /api/v1/products

0 comments on commit fbe08d7

Please sign in to comment.