正则表达式匹配空白分隔键值对:支持值含空格且去首尾空白
修正正则表达式以去除值的尾部空白
需要从文本行中分离键和值组件,规则如下:
- 第一个完整单词为键,键前可存在任意空白(空格/制表符,不含换行)
- 键后接任意数量空白,之后所有内容为值(可包含空白,但需去除尾部空白)
- 值为空时,第二个捕获组为
null
现有正则表达式(?<key>\w+)(?:[ \t]*(?<value>.*))存在问题:会保留值的尾部空白,例如输入____people_________john_jim_jen_josh____时,得到的值为john jim jen josh ,不符合期望。
修正后的正则表达式
^[ \t]*(?<key>\w+)(?:[ \t]+(?<value>.*?[^\s]))?$
正则解释
^:行首锚定,确保匹配从行的开头开始[ \t]*:匹配键前的任意数量空格或制表符,符合键前可存在任意空白的规则(?<key>\w+):捕获命名组key,匹配第一个完整单词作为键(?:[ \t]+(?<value>.*?[^\s]))?:可选的非捕获组,处理值部分:[ \t]+:匹配键后至少一个空白,区分键后有值和无值的情况(?<value>.*?[^\s]):非贪婪匹配所有字符直到最后一个非空白字符,自动去除值的尾部空白?:标记整个组为可选,当键后只有空白或无内容时,该组不匹配,value组为null
$:行尾锚定,确保匹配覆盖整行内容
测试验证
针对给出的测试用例(下划线代表空格):
| 输入文本 | 捕获的key | 捕获的value |
|---|---|---|
key | key | null |
key___ | key | null |
___key___ | key | null |
key___I_am_a_value | key | I am a value |
__key___I_am_a_value | key | I am a value |
__key______I_am_a_value_______ | key | I am a value |
____people_________john_jim_jen_josh____ | people | john jim jen josh |
所有测试用例均符合预期。
另一种等价写法(使用反向断言确保行尾无空白):
^[ \t]*(?<key>\w+)(?:[ \t]*(?<value>.*?))?(?<![ \t])$
(?<![ \t]):反向否定断言,确保行的结尾不是空格或制表符,从而自动排除值的尾部空白
内容的提问来源于stack exchange,提问作者oblivioncth
相关产品推荐
相关产品推荐

