我有一个正则表达式,正在寻找width=["|\']([^"]*)["|\']
在查找width="750"
和width='750'
时效果很好但是它与width=750
不匹配
所以我得到width=["|\']?([^"]*)["|\']
作为可选的第一个引用,但匹配只是继续而不仅仅返回750
答案 0 :(得分:1)
试试这个:
width\s*=\s*(?:["\']([^"\']*)["\']|\S+)
我刚刚在等号为OR条件后添加了\S+
以处理700
。此外,您无需将|
放在角色类[]
\s*
表示可选的空格(零次或多次)。
答案 1 :(得分:1)
字符类([]
)不使用|
来表示or
;他们自动or
一切。您也不必转义单引号(除非您将整个表达式用单引号括起来)。你想要:
["' ]?([^"' ]*)["' ]
答案 2 :(得分:1)
如果您使用支持反向引用的工具或语言,则应该能够使用以下内容:
width=("|'|)(\S*)\1
这将尝试将单引号,双引号或空字符串与第一个捕获组匹配,然后最后的\1
将是第一个捕获的组。该值始终是第二个捕获组的内容。
我还将[^"]*
更改为\S*
,以便匹配任意数量的非空白字符。这是必要的,以确保当值周围没有引号时,您的匹配不会转到字符串的末尾。
答案 3 :(得分:0)
您使用的是哪种正则表达式语言?不同的语言有不同的语法细节,所以有人可能会给你一个在他们的环境中有效而不在你的环境中的答案。
例如,我复制了您的表达式并在Emacs中的某些文本上进行了尝试。它在本文中找到了匹配项:
width=|750|
那是因为Emacs正则表达式不使用'|'字符表示'['和']'括号内的“或者”;它将它解释为表达式可能匹配的另一个字符示例。
此外,看起来你的表达式并不总是在这个例子中的750之后停止:
width='750'
相反,如果在输入的后面有一个'“'字符,它会匹配从750到该字符的所有内容。(如果之前有一个''',它在我之前的Emacs示例中做了同样的事情。输入。)
您还将匹配此中的750(请注意不匹配的引号):
width='750"
这是一个问题,还是可以接受的结果?