C# 匹配,直到正则表达式无法正常工作

C# 匹配,直到正则表达式无法正常工作,c#,.net,regex,C#,.net,Regex,我有一个正则表达式,它应该匹配1='aa'或1='aa'或1=aa,并返回数字/值 (?<number>\d)=\s*("|')?\s*(?<value>.*?)(?=("|')?\d=|$) (?\d)=\s*(“|”)?\s*(?*??)((“|”)?\d=$) 它可以工作,但返回的值不正确。数字返回为1,但值在1=“aa”的情况下为aa” 对于1=“aa”的情况,如何获得value=aa 实际表达式可能包含1='aa'2=“bb”3=cc等。这里的主要问题是:

我有一个正则表达式,它应该匹配1='aa'或1='aa'或1=aa,并返回数字/值

(?<number>\d)=\s*("|')?\s*(?<value>.*?)(?=("|')?\d=|$)
(?\d)=\s*(“|”)?\s*(?*??)((“|”)?\d=$)
它可以工作,但返回的值不正确。数字返回为1,但值在1=“aa”的情况下为aa”

对于1=“aa”的情况,如何获得value=aa


实际表达式可能包含1='aa'2=“bb”3=cc等。

这里的主要问题是:

(?=("|')?\d=|$)
指“后接以下任何一项:

(
 (
  (?P<number>\d)="(?P<value>[^"]+)"     #or * in stead of + if value can be empty
 ) |
 (
  (?P<number>\d)='(?P<value>[^']+)'     #or * in stead of + if value can be empty
 ) |
 (
  (?P<number>\d)=(?P<value>[^\s]+)      #here you should also choose where you stop 
 )
)
  • 加上一个数字加上
    =
  • 加上一个数字加上
    =
  • 数字加上
    =
  • 结束
“。您会注意到,它不允许
和数字之间有任何空格;因此在
1=“aa”2=…
的情况下,
后面不允许有
“2=…
。类似地,它不允许
加上字符串结尾

因此,最简单的解决方法是允许-不,需要-数字前有一些空格,并将
(“|”)移出lookahead断言,移到regex的主要部分:

("|')?(?=\s+\d=|$)
给予:

(?<number>\d)=\s*("|')?\s*(?<value>.*?)("|')?(?=\s+\d=|$)
(?\d)=\s*(“|”)?\s*(?*”(“|”)?(?=\s+\d=|$)
当我们在做的时候,我们还可以做一些其他的调整来简化正则表达式并减少可能出错的情况:

(?<number>\d)=\s*(["']?)(?<value>.*?)\1(?=\s+\d=|$)
(?\d)=\s*([“'])(?*?)\1(?=\s+\d=|$)

(进一步的清理可能是可能的,但我对您的数据了解不够,无法推荐更多的更改。)

这里的主要问题是:

(?=("|')?\d=|$)
指“后接以下任何一项:

(
 (
  (?P<number>\d)="(?P<value>[^"]+)"     #or * in stead of + if value can be empty
 ) |
 (
  (?P<number>\d)='(?P<value>[^']+)'     #or * in stead of + if value can be empty
 ) |
 (
  (?P<number>\d)=(?P<value>[^\s]+)      #here you should also choose where you stop 
 )
)
  • 加上一个数字加上
    =
  • 加上一个数字加上
    =
  • 数字加上
    =
  • 结束
“。您会注意到,它不允许
和数字之间有任何空格;因此在
1=“aa”2=…
的情况下,
后面不允许有
“2=…
。类似地,它不允许
加上字符串结尾

因此,最简单的解决方法是允许-不,需要-数字前有一些空格,并将
(“|”)移出lookahead断言,移到regex的主要部分:

("|')?(?=\s+\d=|$)
给予:

(?<number>\d)=\s*("|')?\s*(?<value>.*?)("|')?(?=\s+\d=|$)
(?\d)=\s*(“|”)?\s*(?*”(“|”)?(?=\s+\d=|$)
当我们在做的时候,我们还可以做一些其他的调整来简化正则表达式并减少可能出错的情况:

(?<number>\d)=\s*(["']?)(?<value>.*?)\1(?=\s+\d=|$)
(?\d)=\s*([“'])(?*?)\1(?=\s+\d=|$)
(进一步的清理可能是可能的,但我对您的数据了解不够,无法推荐更多的更改。)

试试看

(?<number>\d)=\s*("|')?\s*(?<value>.+?)("|')?(\s|$)
(?\d)=\s*(“|”)?\s*(?。+)(“|”)(\s |$)
如果作业后面有空格或行尾,它将起作用。

试试看

(?<number>\d)=\s*("|')?\s*(?<value>.+?)("|')?(\s|$)
(?\d)=\s*(“|”)?\s*(?。+)(“|”)(\s |$)

如果赋值后面有空格或行尾,则它将起作用。

保持简单。精确匹配引号符号对(相同,例如不同:
1='aa“
)的最简单易读方法如下:

(
 (
  (?P<number>\d)="(?P<value>[^"]+)"     #or * in stead of + if value can be empty
 ) |
 (
  (?P<number>\d)='(?P<value>[^']+)'     #or * in stead of + if value can be empty
 ) |
 (
  (?P<number>\d)=(?P<value>[^\s]+)      #here you should also choose where you stop 
 )
)
(
(
(?P\d)=“(?P[^”]+)”#或*代替+如果值可以为空
) |
(
(?P\d)='(?P[^']+)#或*代替+如果值可以为空
) |
(
(?P\d)=(P[^\s]+)#在这里,您还应该选择停车的位置
)
)

保持简单。精确匹配一对引号符号(它们相同,例如不同:
1='aa“
)的最简单易读方法如下:

(
 (
  (?P<number>\d)="(?P<value>[^"]+)"     #or * in stead of + if value can be empty
 ) |
 (
  (?P<number>\d)='(?P<value>[^']+)'     #or * in stead of + if value can be empty
 ) |
 (
  (?P<number>\d)=(?P<value>[^\s]+)      #here you should also choose where you stop 
 )
)
(
(
(?P\d)=“(?P[^”]+)”#或*代替+如果值可以为空
) |
(
(?P\d)='(?P[^']+)#或*代替+如果值可以为空
) |
(
(?P\d)=(P[^\s]+)#在这里,您还应该选择停车的位置
)
)

需要考虑的其他事项:

  • 您的原始表达式(但不是示例)似乎旨在支持等号附近的空格
  • 您的号码是否需要支持多个数字
  • 对可选字符使用方括号可以避免不必要的捕获组

    (?\d+)\s*=\s*[“”]?(?[^“”\s]+)[“”]


需要考虑的其他事项:

  • 您的原始表达式(但不是示例)似乎旨在支持等号附近的空格
  • 您的号码是否需要支持多个数字
  • 对可选字符使用方括号可以避免不必要的捕获组

    (?\d+)\s*=\s*[“”]?(?[^“”\s]+)[“”]


我编辑了我的答案,因为我的上一个解决方案只适用于单个作业。我编辑了我的答案,因为我的上一个解决方案只适用于单个作业。谢谢。它工作正常。当您从SO复制时,它也复制了一行,因此它工作不正常。谢谢您的帮助。谢谢。它工作正常。当您从SO复制,它也复制了一个新行,因此无法正常工作。谢谢您的帮助。