匹配,直到正则表达式无法正常工作
本文关键字:常工作 工作 正则表达式 匹配 | 更新日期: 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|$)
如果赋值后面有空格或换行符,它就会起作用。