只有在开头引用时,正则表达式匹配终止报价

时间:2012-01-04 08:24:50

标签: regex

我想将以下元素与正则表达式匹配

target="#MOBILE"

以及所有有效的变体。

我写了正则表达式

target[\s\S]*#MOBILE[^>^\s]*

匹配以下

target="#MOBILE"
target = "#MOBILE"
target=#MOBILE
target="#MOBILE" (followed directly by >)

但不匹配

target=" #MOBILE " 

正确(注意额外的空间)。它只匹配

target=" #MOBILE 

错过了最终报价

我需要的是终止表达式[^>^\s]*,只有当它与开头的引号匹配时才匹配引号。它还需要使用单引号。终止表达式也需要以当前的空格或>字符结尾。

我确信有办法做到这一点 - 但我不确定如何做到这一点。这可能是标准的东西 - 我只是不知道它

我很不确定[^>^\s]*是正则表达式找到space>字符时终止的最佳方式,但这是我能让它工作的唯一方法。

3 个答案:

答案 0 :(得分:2)

您可以使用backreference,类似于jensgram的建议:

target\s*=\s*(?:(")\s*)?#Mobile\s*\1

(?:(")\s*)? - 包含引号(已捕获)和其他可选空格的可选非捕获组。如果匹配,\1将包含引用。

工作示例:http://regexr.com?2vkkq

.Net的更好替代方案(主要是因为您需要单引号,而\1对于未捕获的组表现不同):

target\s*=\s*(["']?)\s*?#Mobile\s*\1

工作示例:Regex Storm

答案 1 :(得分:1)

如果您需要检查引号是否成对,请尝试以下操作:

target\s*=\s*(['"])(?=\1)\s*#MOBILE\s*(?<=\1)\1

但这取决于您的正则表达式引擎是否支持正{1}}语法。如果它支持反向引用。

答案 2 :(得分:0)

没有引号target\s*=\s*#MOBILE

使用双引号target\s*=\s*"\s*#MOBILE\s*"

使用单引号target\s*=\s*'\s*#MOBILE\s*'

一起

(target\s*=\s*#MOBILE)|(target\s*=\s*"\s*#MOBILE\s*")|(target\s*=\s*'\s*#MOBILE\s*')

或者有人可以整理它。