1
Fork 0
mirror of https://github.com/RGBCube/uutils-coreutils synced 2025-07-27 19:17:43 +00:00

expr: Fix parsing negated character classes "[^a]" (#7884)

* expr: Fix regex escape logic

We have to track if the previous character was already escaped to determine
if the '\' character should be interpreted as an escape character.

* expr: Fix parsing caret (^) as character class negation token

* expr: Add tests for parsing carets in regex

* expr: Add missing semicolon

* expr: Simplify boolean assignment

Co-authored-by: Daniel Hofstetter <daniel.hofstetter@42dh.com>

---------

Co-authored-by: Daniel Hofstetter <daniel.hofstetter@42dh.com>
This commit is contained in:
Teemu Pätsi 2025-05-04 18:35:18 +03:00 committed by GitHub
parent 69d5cf40b1
commit 4ee53acad0
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
2 changed files with 32 additions and 2 deletions

View file

@ -302,6 +302,26 @@ fn test_regex() {
.args(&["^^^^^^^^^", ":", "^^^"])
.succeeds()
.stdout_only("2\n");
new_ucmd!()
.args(&["ab[^c]", ":", "ab[^c]"])
.succeeds()
.stdout_only("3\n"); // Matches "ab["
new_ucmd!()
.args(&["ab[^c]", ":", "ab\\[^c]"])
.succeeds()
.stdout_only("6\n");
new_ucmd!()
.args(&["[^a]", ":", "\\[^a]"])
.succeeds()
.stdout_only("4\n");
new_ucmd!()
.args(&["\\a", ":", "\\\\[^^]"])
.succeeds()
.stdout_only("2\n");
new_ucmd!()
.args(&["^a", ":", "^^[^^]"])
.succeeds()
.stdout_only("2\n");
new_ucmd!()
.args(&["-5", ":", "-\\{0,1\\}[0-9]*$"])
.succeeds()
@ -319,6 +339,10 @@ fn test_regex() {
.args(&["^abc", ":", "^abc"])
.fails()
.stdout_only("0\n");
new_ucmd!()
.args(&["abc", ":", "ab[^c]"])
.fails()
.stdout_only("0\n");
}
#[test]