Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[2201.10.x] Add BBE for Regexp find operations #5794

Merged
merged 7 commits into from
Oct 29, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 7 additions & 0 deletions examples/index.json
Original file line number Diff line number Diff line change
Expand Up @@ -1216,6 +1216,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
Loading