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

本文关键字:常工作 工作 正则表达式 匹配 | 更新日期: 2023-09-27 18:29:03

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

(?<number>'d)='s*("|')?'s*(?<value>.*?)(?=("|')?'d=|$)

它有效,但返回的值不正确。在1="aa"的情况下,数字返回为1,但值为aa

对于1="aa"的情况,我如何获得value=aa。

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

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

这里的主要问题是:

(?=("|')?'d=|$)

表示"后面跟着以下任何一项:

  • "加一位数字加=
  • '加一位数字加=
  • 一位数字加=
  • 字符串末尾

".您会注意到,它不允许"'与数字之间留出任何空白;因此,在1="aa" 2=...的情况下,value后面不允许跟在" 2=...后面。同样,它也不允许"'加上字符串末尾留出任何空白。

因此,最低限度的解决方案是允许;不,需要—数字前的一些空白,并将("|')?从前瞻性断言中移到正则表达式的主要部分:

("|')?(?='s+'d=|$)

给予:

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

当我们在做这件事的时候,我们还可以做一些其他的调整来简化正则表达式,并减少它可能出错的情况:

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

(可能会进行进一步的清理,但我对您的数据了解不够,无法建议进行更多更改。)

保持简单。准确匹配一对引号符号(它们是相同的,例如不相似: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 
 )
)

其他需要考虑的项目:

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

    (?<数字>''d+)''s*=''s*["']?(?&llt;数值>[^"'''s]+)["'']?

尝试

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

如果赋值后面有空格或换行符,它就会起作用。