negative look head和except的异同

Similarities and differences between negative look head and except

我有 following regex:

(?<t>[^:=]*)(:(?<u>[^:=]*))?(:(?<v>[^:=]*))?=(?<value>.*)

它的目的是像AppSettings:Envionment:Other=Dev一样获取输入并解析出来。它非常适合这个。

我现在需要更改它以解析 AppSettings__Envionment__Other=Dev。用双下划线替换单个冒号。

问题在于 ^ 运算符仅适用于一个字符。

在搜索过程中,我发现当您需要一次匹配多个字符时,您应该使用否定先行功能 (?!\_\_)。我tried that out(暂时去掉需要等号):

(?<t>(?!\_\_)*)(\_\_(?<u>(?!\_\_)*))?(\_\_(?<v>(?!\_\_)))

AppSettings__Envionment__Other 的输入没有得到正确的捕获(tuv 应该是下划线之间的单词)。

此外,我仍然需要它不匹配双下划线 (__) 和等号 (=)。 运行 完全领先于我想要的东西(但没有)I tried this:

(?<t>(?!\_\_)(?!=)*)(\_\_(?<u>(?!\_\_)(?!=)*))?(\_\_(?<v>(?!\_\_)(?!=)*))?=(?<value>.*)

但这还差得远呢。 (它只匹配等号。)

如何从不匹配 := 到不匹配 __=

您将如何创建一个语句,将 ^ 用于几个等同于几个负先行的字符?

更新:

我应该提供更多我希望解析的输入示例。以下所有内容都需要由 RegEx 解析:

AppSettings__Envionment__Other=Dev
AppSettings__ConnectionString=SomeValue
LogLevel=Debug

您可以将此正则表达式用于 __ 字符串:

(?<t>.*?)(__(?<u>.*?))?(__(?<v>[^=]*))?=(?<value>.*)

RegEx Demo

正则表达式详细信息:

  • (?<t>.*?):匹配0个或多个除=以外的任意字符,捕获到组t中(惰性匹配)
  • (__(?<u>.*?))?可选地匹配 __后跟0个或多个任意字符并将其捕获到组u[=46=中]
  • (__(?<v>[^=]*))?可选地匹配 __后跟0个或多个除=以外的任何字符,并将其捕获到组v
  • =:匹配一个=
  • (?<value>.*):

另一种选择是像这样使用缓和贪婪模式(有点长):

(?<t>(?:(?!__).)*)(__(?<u>(?:(?!__).)*))?(__(?<v>[^=]*))?=(?<value>.*)

或者,要同时匹配 :__ 分隔符模式,请使用:

/^(?<t>[^:_=]*)(?:[:_]+(?<u>[^:_=]*))?(?:[:_]+(?<v>[^:_=]*))?=(?<value>.*)/gm

诀窍是在 [^:_=]* 扫描后扫描 [:_]+