使用可选的分隔符处理行

时间:2019-03-03 00:24:46

标签: regex regex-negation

我必须处理一个文件,该文件具有以下格式的行:

{name:value}
  • 名称可以有一个:,可以使用\进行转义。
  • :是可选的,在这种情况下,只需要读取名称。
  • 如果:不存在,则值丢失。该值还可以包含},可以使用\进行转义。

因此,有效值为:

{john:nice person}
{john} 

我使用了此正则表达式:

{(?<name>.*?(?=(?<!\\)\:))(?<separator>:?)(?<value>.*?(?=(?<!\\)\}))}

适用于第一种格式,但如果格式为{name},但没有分隔符和值,则失败。有什么想法可以修改正则表达式以读取两种格式吗?

2 个答案:

答案 0 :(得分:0)

Try \{(?<name>(?:[^:}]|\\:)+)(?:(?<!\\):(?<value>(?:[^}]|\\\})+))?(?<!\\)\}

我将分隔符 value 分组为一个可选组(?:)?

答案 1 :(得分:0)

尝试一下:

\{((?:[^\n:]|(?<=\\):)+)(?::((?:[^:\n}]|(?<=\\)})+))?}

请参见live demo