我想将以下元素与正则表达式匹配
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
或>
字符时终止的最佳方式,但这是我能让它工作的唯一方法。
答案 0 :(得分:2)
您可以使用backreference,类似于jensgram的建议:
target\s*=\s*(?:(")\s*)?#Mobile\s*\1
(?:(")\s*)?
- 包含引号(已捕获)和其他可选空格的可选非捕获组。如果匹配,\1
将包含引用。
.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*')
或者有人可以整理它。