一种简单的配置文件格式

一种简单的配置文件格式

核心原则

  1. 只做数据交换,不负责任何其他职责。
  2. 一切作为字符串处理。
  3. 采用 key=value 格式。悬垂 key 时,等号可以省略。
  4. 字符串可以按特定格式解释为 List[str]Dict[String,String] ,具体解析行为由应用层决定。

基本结构

example 复制代码
# 省略形式,同 key = ""
key 
# 标准形式,同 key = ""
key =              
# 标准形式
key = value      
# 标准形式
"key with =" = value
# 格式支持,由程序决定是否允许 "" 作为键。
"" =

值的类型与形式

| 形式 | 示例 | 结果 |

|--------------±------------------------------±------------------------|

| 裸字符串 | key = foo | "foo" |

| 含空格 | key = foo bar | "foo bar" |

| 双引号包裹 | key = "foo bar" | "foo bar" |

| 单引号包裹 | key = 'foo bar' | "foo bar" |

| 多行字符串 | key = """...""" | 保留换行和缩进 |

键的规则

  • 键可以包含任何字符(包括空格、等号、引号等)。
  • 如果键包含 =(等号),必须用双引号或单引号包裹。
  • 如果键包含首尾空格,也必须用引号包裹。
  • 引号包裹的键,内部引号需转义(见转义规则)。
  • 键两侧的空格会被自动 trim
  • 键可以重复,具体合法性与有效值由程序决定。
example 复制代码
# 普通键
key = value                     
# 含空格的键
"key with spaces" = value       
# 含等号的键
"key=with=equals" = value       
# 含引号的键
'key with "quotes"' = value     

值的规则

  • 值可以是任意字符串。
  • 无引号包裹时,值会 trim 首尾空格。
  • 有引号包裹时,值保留首尾空格。
  • 值中的转义序列会被处理(见转义规则)。
  • 相同类型引号在字符串内禁止出现,需用另一种引号包裹。
example 复制代码
# 同 "simple"
key1 = simple                
# 同 "leading spaces"(trim后)    
key2 =   leading spaces      
# 同 "  kept spaces  "
key3 = "  kept spaces  "         
# 同 "  kept spaces  "
key4 = '  kept spaces  '         

引号规则

  1. 单引号 ' 和双引号 " 完全等效。
  2. 引号可选,仅在以下情况必须使用:
    • 值需要保留首尾空格
    • 值以空格开头或结尾
    • 键包含等号或首尾空格
  3. 引号包裹的字符串内,相同类型的引号需要转义(见转义规则)。
example 复制代码
# 保留首尾空格
key1 = "  spaces  "              
# 同上
key2 = '  spaces  '              
# 键含等号
"key with =" = value             
# 键含双引号
'key "quoted"' = value         

转义规则

只有一种转义序列:\uXXXX(4位十六进制 Unicode)。

  • \uXXXX → 对应的 Unicode 字符
  • \\u → 字面量 \u(两个字符:反斜杠 + u)
  • 其他 \c 组合 → \ 作为普通字符保留,c 原样保留
  • 转义仅在字符串解析时处理,不影响文件存储
example 复制代码
# 世界
unicode = \u4e16\u754c   
# "\u4e16"
literal = \\u4e16           
# "C:\\Users\\name"(反斜杠保留)
raw = C:\Users\name         
# 同 'he said "hello"'
quote = "he said 'hello'"   

多行字符串

使用 """ 包裹,支持换行和缩进原样保留,不进行 trim

语法规则

  • """ 可以独占一行,也可以紧跟内容开始
  • 结束的 """ 必须独占一行
  • 内容中的所有字符(包括换行、缩进、空格)都原样保留
  • 多行字符串内的引号无需转义,除非是 """ 序列。此时需要以 \u0022 或 \u0027 转义。

示例

example 复制代码
query = """
SELECT id, name
FROM users
WHERE active = 1
"""

template = """Hello
  World"""

sql = "SELECT * FROM users"     # 单行时不使用多行语法

注释

  • # 开头的行是注释,完全忽略。
  • 不支持行内注释(# 出现在值中时作为普通字符)。
  • 空行被忽略。
example 复制代码
# 这是注释
enabled                          # 这不是注释,# 是值的一部分
host = localhost

# 空行上方会被忽略
port = 8080

数组与字典(程序层解析)

配置层只传递字符串,结构化解析由应用层负责。

数组约定

应用层可将逗号分隔的值解析为数组:

example 复制代码
cors = http://a.com,https://b.com,http://c.com
# 应用层可以解析为 ["http://a.com", "https://b.com", "http://c.com"]

字典约定

应用层可将冒号分隔的键值对解析为字典:

example 复制代码
levels = debug:1,info:2,error:3
# 应用层可以解析为 {"debug": "1", "info": "2", "error": "3"}

注意事项

  • 这些格式约定不是语法规则,而是应用层的常见实践。
  • 应用可以自由选择其他解析方式(如 JSON 嵌套)。

完整示例

example 复制代码
# 悬垂键(空值)
enabled
debug

# 简单值
host = localhost
port = 8080

# 含空格的值(等效写法)
path = /var/log/app
path = "/var/log/app"

# 含特殊字符的键
"server.host" = localhost
"key with spaces" = value
"key=with=equals" = value

# 多行
query = """
SELECT id, name
FROM users
WHERE active = 1
"""

# 程序层可以解析为数组
cors = http://a.com,https://b.com

# 程序层可以解析为字典
levels = debug:1,info:2,error:3

# 保留首尾空格
spaced = "  hello world  "

# Unicode 转义
greeting = \u4f60\u597d

# 字面量反斜杠
path = C:\Users\name

规范要点

项目 规则
任意字符,含等号时必须引号包裹
值分隔 等号(=)
值内容 保留内部空格,无引号时 trim 首尾空格
引号 可选,单双等效
转义 仅 \uXXXX
多行 """ 包裹,保留换行和缩进
注释 行首 #,无行内注释
类型 纯字符串,无类型系统
结构 逗号/冒号在值内,由程序层解析
复制代码
相关推荐
问心无愧051319 小时前
ctf show web入门37
笔记
羊群智妍19 小时前
2026生成式AI搜索优化:GEO监测工具全解析
笔记
koo36421 小时前
周报5.10
笔记
kdxiaojie1 天前
U-Boot分析【学习笔记】(3)
linux·笔记·学习
智者知已应修善业1 天前
【51单片机模拟生日蜡烛】2023-10-10
c++·经验分享·笔记·算法·51单片机
智者知已应修善业1 天前
【51单片机如何让LED灯从一亮到八,再从八亮到一】2023-10-13
c++·经验分享·笔记·算法·51单片机
qeen871 天前
【数据结构】二叉树相关经典函数C语言实现
c语言·数据结构·c++·笔记·学习·算法·二叉树
Alice-YUE1 天前
深入解析 JS 事件循环:浏览器与 Node.js 的差异全解析
前端·javascript·笔记·学习
fanged1 天前
高通平台IMU的Bringup(TODO)
笔记
远离UE41 天前
Vulkan学习笔记
笔记·学习