我有这个正则表达式,应该匹配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等。
答案 0 :(得分:3)
这里的主要问题是:
(?=("|')?\d=|$)
表示“后跟以下任何一项:
"
加上数字加=
'
加上数字加=
=
“。您会注意到它 不允许"
或'
与数字之间的空白;所以在{{1}的情况下} {} 1="aa" 2=...
只是允许后面跟value
。同样,它不允许{{1} }或" 2=...
加上字符串结尾。
所以最小修复是允许 - 不,需要 - 在数字之前的一些空格,并将"
移出前瞻断言并进入正则表达式的主要部分:
'
,并提供:
("|')?
虽然我们正在努力,但我们不妨进行一些其他调整以简化正则表达式并减少可能出错的案例数量:
("|')?(?=\s+\d=|$)
(可能会进一步清理,但我对您的数据不够了解,无法推荐更改。)
答案 1 :(得分:1)
保持简单。最简单和可读的方式匹配完全一对引号符号(它们是相同的,例如不像那里: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
)
)
答案 2 :(得分:0)
尝试
(?<number>\d)=\s*("|')?\s*(?<value>.+?)("|')?(\s|$)
如果分配后跟空格或行尾,它将起作用。
答案 3 :(得分:0)
需要考虑的其他事项:
使用方括号表示可选字符可以避免不必要的捕获组
(小于?数&GT; \ d +)\ S * = \ S * [ “']?(小于?值GT; [^” '\ S] +)?[“']