regex - 为什么这个正则表达式不匹配我的换行符分隔键=值对?
问题描述
我正在尝试编写一个正则表达式来验证应该遵循这些规则的输入:
- 0 行或多行(由
\n
、\r
或分隔\r\n
) - 每行由以下组成:从 1 到 100 个
a-zA-Z
字符,然后是 1 个等号,然后是从 1 到 100 个字母数字字符,然后是可选换行符
匹配的例子:
a=1
foo=bar
a=1
b=2
(额外的空行是可以的)
不匹配的例子:
a
(缺少等号和值)
1=1
(键有数字)
a=1
b=
(第二行缺失值)
我尝试了什么:
(?<key>[a-zA-Z]{1,100})[=](?<value>[a-zA-Z0-9]{1,100}[^\r\n|\r|\n]{1})
但这不匹配,而我希望它:
a=one
b=two
c=3
d=33
eee=eee
c=3
线路不匹配。
见https://regex101.com/r/C039en/2/
我究竟做错了什么?
谢谢!
解决方案
使用 PCRE 正则表达式引擎,您可以使用
^([a-zA-Z]{1,100}=[a-zA-Z0-9]{1,100})(?:\R(?1))*$
或者,如果它不符合 PCRE:
^[a-zA-Z]{1,100}=[a-zA-Z0-9]{1,100}(?:(?:\r\n?|\n)[a-zA-Z]{1,100}=[a-zA-Z0-9]{1,100})*$
请参阅正则表达式演示 #1 和正则表达式演示 #2。
细节#1
^
- 字符串的开始([a-zA-Z]{1,100}=[a-zA-Z0-9]{1,100})
- 第 1 组:一到一百个 ASCII 字母、=
一到一百个 ASCII 字母数字字符(?:\R(?1))*
- 任何换行序列的零次或多次重复,后跟第 1 组模式$
- 字符串结束。
细节#2
^
- 字符串的开始[a-zA-Z]{1,100}=[a-zA-Z0-9]{1,100}
- 一到一百个 ASCII 字母,=
一到一百个 ASCII 字母数字字符(?:(?:\r\n?|\n)[a-zA-Z]{1,100}=[a-zA-Z0-9]{1,100})*
- 零次或多次重复 CRLF、CR 或 LF 行尾,然后是一到一百个 ASCII 字母=
、一到一百个 ASCII 字母数字字符$
- 字符串结束。
推荐阅读
- download - GNU Emacs 下载的 gpg 验证失败 - 我做对了吗?
- firebase - Android Firebase:生成发布证书指纹时出错
- java - 使用Graphics每帧清屏不是一个好主意吗?(爪哇)
- c# - 脚本组件缺少 oracle 参考
- c# - 当等待的一部分具有 ConfigureAwait false 时使用 MessageBox
- android - 从 Naught 和 Oreo 设备中的 mediastore 获取 URI 的文件名和路径
- angularjs - 如何在html中放置角度js控制器
- python - 无法在具有 GPU 的机器上安装没有 CUDA 支持的 Keras MXNet
- c# - .CS 文件中的 DataGrid 千位分隔符 WPF
- android-studio - Check Image view is empty or not?