如何编写正则表达式匹配逗号分隔的key:value键值对?Rust正则表达式实现方法
Rust正则表达式匹配无尾随逗号的键值对序列
最终正则表达式
r"^[^:,]+:[^,]+(?:,[^:,]+:[^,]+)*$"
正则表达式拆解
让我们逐个部分解析这个正则的逻辑,完全贴合你的需求:
^和$:锚定字符串的开头和结尾,强制正则匹配整个字符串,杜绝部分匹配的情况。[^:,]+:匹配键部分。[^:,]表示匹配除冒号(:)和逗号(,)之外的任意ASCII字符,+限定符保证键至少有一个字符,满足“每个子序列均非空”的要求。::匹配键与值之间的固定分隔符。[^,]+:匹配值部分。[^,]表示匹配除逗号之外的任意ASCII字符,+限定符保证值至少有一个字符,同样满足非空要求。(?:,[^:,]+:[^,]+)*:这是一个非捕获组,用于匹配零个或多个后续键值对:,:仅在存在下一个键值对时出现,从根源上避免了尾随逗号的问题。[^:,]+:[^,]+:和单个键值对的结构一致,确保后续每个键值对都符合规则。*:允许零个后续键值对(即单个键值对场景,比如a:b),同时支持多键值对的情况。
测试示例
匹配成功的案例
- 单个键值对:
a:b - 多个键值对:
a:b,c:d - 含特殊字符的键值对:
hello:world!123,foo:bar@baz
匹配失败的案例
- 值为空:
a: - 键为空:
:b - 尾随逗号:
a:b,或a:b,c:d, - 键包含逗号:
a,b:c
Rust代码使用示例
先确保在Cargo.toml中添加regex依赖,然后可以这样使用:
use regex::Regex; fn main() { // 编译正则表达式 let key_value_re = Regex::new(r"^[^:,]+:[^,]+(?:,[^:,]+:[^,]+)*$").expect("Invalid regex"); // 验证匹配场景 assert!(key_value_re.is_match("a:b")); assert!(key_value_re.is_match("user:john_doe,email:john@example.com")); // 验证不匹配场景 assert!(!key_value_re.is_match("invalid_key:,value")); assert!(!key_value_re.is_match("name:alice,")); }
内容的提问来源于stack exchange,提问作者lnshi
相关产品推荐
相关产品推荐

