1
Fork 0
mirror of https://github.com/RGBCube/uutils-coreutils synced 2025-07-31 13:07:46 +00:00

expr: Allow initial asterisk in regular expressions

GNU expr appears to treat this as a literal asterisk
This commit is contained in:
Joseph Jon Booker 2024-03-27 22:28:41 -05:00
parent 6a7df7d6c1
commit fa0bd722b7

View file

@ -140,7 +140,8 @@ impl StringOp {
let left = left.eval()?.eval_as_string();
let right = right.eval()?.eval_as_string();
validate_regex(&right)?;
let re_string = format!("^{right}");
let prefix = if right.starts_with('*') { r"^\" } else { "^" };
let re_string = format!("{prefix}{right}");
let re = Regex::with_options(
&re_string,
RegexOptions::REGEX_OPTION_NONE,
@ -681,6 +682,21 @@ mod test {
assert_eq!(result.eval_as_string(), "");
}
#[test]
fn starting_stars_become_escaped() {
let result = AstNode::parse(&["yolo", ":", r"*yolo"])
.unwrap()
.eval()
.unwrap();
assert_eq!(result.eval_as_string(), "0");
let result = AstNode::parse(&["*yolo", ":", r"*yolo"])
.unwrap()
.eval()
.unwrap();
assert_eq!(result.eval_as_string(), "5");
}
#[test]
fn validate_regex_valid() {
assert!(validate_regex(r"(a+b) \(a* b\)").is_ok());