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
的输入没有得到正确的捕获(t
、u
和 v
应该是下划线之间的单词)。
此外,我仍然需要它不匹配双下划线 (__
) 和等号 (=
)。 运行 完全领先于我想要的东西(但没有)I tried this:
(?<t>(?!\_\_)(?!=)*)(\_\_(?<u>(?!\_\_)(?!=)*))?(\_\_(?<v>(?!\_\_)(?!=)*))?=(?<value>.*)
但这还差得远呢。 (它只匹配等号。)
如何从不匹配 :
和 =
到不匹配 __
和 =
?
您将如何创建一个语句,将 ^
用于几个等同于几个负先行的字符?
更新:
我应该提供更多我希望解析的输入示例。以下所有内容都需要由 RegEx 解析:
AppSettings__Envionment__Other=Dev
AppSettings__ConnectionString=SomeValue
LogLevel=Debug
您可以将此正则表达式用于 __
字符串:
(?<t>.*?)(__(?<u>.*?))?(__(?<v>[^=]*))?=(?<value>.*)
正则表达式详细信息:
(?<t>.*?)
:匹配0个或多个除=
以外的任意字符,捕获到组t
中(惰性匹配)
(__(?<u>.*?))?
:可选地匹配 __
后跟0个或多个任意字符并将其捕获到组u
[=46=中]
(__(?<v>[^=]*))?
:可选地匹配 __
后跟0个或多个除=
以外的任何字符,并将其捕获到组v
=
:匹配一个=
(?<value>.*)
:
另一种选择是像这样使用缓和贪婪模式(有点长):
(?<t>(?:(?!__).)*)(__(?<u>(?:(?!__).)*))?(__(?<v>[^=]*))?=(?<value>.*)
或者,要同时匹配 :
和 __
分隔符模式,请使用:
/^(?<t>[^:_=]*)(?:[:_]+(?<u>[^:_=]*))?(?:[:_]+(?<v>[^:_=]*))?=(?<value>.*)/gm
诀窍是在 [^:_=]*
扫描后扫描 [:_]+
。
我有 following regex:
(?<t>[^:=]*)(:(?<u>[^:=]*))?(:(?<v>[^:=]*))?=(?<value>.*)
它的目的是像AppSettings:Envionment:Other=Dev
一样获取输入并解析出来。它非常适合这个。
我现在需要更改它以解析 AppSettings__Envionment__Other=Dev
。用双下划线替换单个冒号。
问题在于 ^
运算符仅适用于一个字符。
在搜索过程中,我发现当您需要一次匹配多个字符时,您应该使用否定先行功能 (?!\_\_)
。我tried that out(暂时去掉需要等号):
(?<t>(?!\_\_)*)(\_\_(?<u>(?!\_\_)*))?(\_\_(?<v>(?!\_\_)))
AppSettings__Envionment__Other
的输入没有得到正确的捕获(t
、u
和 v
应该是下划线之间的单词)。
此外,我仍然需要它不匹配双下划线 (__
) 和等号 (=
)。 运行 完全领先于我想要的东西(但没有)I tried this:
(?<t>(?!\_\_)(?!=)*)(\_\_(?<u>(?!\_\_)(?!=)*))?(\_\_(?<v>(?!\_\_)(?!=)*))?=(?<value>.*)
但这还差得远呢。 (它只匹配等号。)
如何从不匹配 :
和 =
到不匹配 __
和 =
?
您将如何创建一个语句,将 ^
用于几个等同于几个负先行的字符?
更新:
我应该提供更多我希望解析的输入示例。以下所有内容都需要由 RegEx 解析:
AppSettings__Envionment__Other=Dev
AppSettings__ConnectionString=SomeValue
LogLevel=Debug
您可以将此正则表达式用于 __
字符串:
(?<t>.*?)(__(?<u>.*?))?(__(?<v>[^=]*))?=(?<value>.*)
正则表达式详细信息:
(?<t>.*?)
:匹配0个或多个除=
以外的任意字符,捕获到组t
中(惰性匹配)(__(?<u>.*?))?
:可选地匹配__
后跟0个或多个任意字符并将其捕获到组u
[=46=中](__(?<v>[^=]*))?
:可选地匹配__
后跟0个或多个除=
以外的任何字符,并将其捕获到组v
=
:匹配一个=
(?<value>.*)
:
另一种选择是像这样使用缓和贪婪模式(有点长):
(?<t>(?:(?!__).)*)(__(?<u>(?:(?!__).)*))?(__(?<v>[^=]*))?=(?<value>.*)
或者,要同时匹配 :
和 __
分隔符模式,请使用:
/^(?<t>[^:_=]*)(?:[:_]+(?<u>[^:_=]*))?(?:[:_]+(?<v>[^:_=]*))?=(?<value>.*)/gm
诀窍是在 [^:_=]*
扫描后扫描 [:_]+
。