首页 > 解决方案 > 为什么这个正则表达式不匹配我的换行符分隔键=值对?

问题描述

我正在尝试编写一个正则表达式来验证应该遵循这些规则的输入:

匹配的例子:

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/

我究竟做错了什么?

谢谢!

标签: regex

解决方案


使用 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 字母数字字符
  • $- 字符串结束。

推荐阅读