我有一个应该捕获的正则表达式:
[=foo]
[="foo"]
[='foo']
开始和结尾必须相同,所以我要捕获引号并以\ 1结尾。它用来不加引号的问号:
\[=(['\"]?)(.+)\1\]
如果我在一行上尝试可以正常工作,但是当我尝试编写其他任何内容并调用闭包括号时,它将一直匹配到该括号。行为的一些示例:https://regex101.com/r/4qYzyS/1
有人解决吗?要匹配我想要的3种模式而没有冲突?谢谢。
答案 0 :(得分:2)
将点设为非贪婪,即使用(.+?)
。另外,您可能要关闭第二个捕获组,或者可能只是将其完全删除。例如。以下模式似乎有效:
\[=([\"']?).+?\1\]
这是一个示例Python脚本:
input = "[=\"foo\"]\n[=\"Lorem ipsum\"]\n\n[=foo]Lorem ipsum]";
for match in re.finditer(r"\[=([\"']?).+?\1\]", input):
print match.group(0)
[="foo"]
[="Lorem ipsum"]
[=foo]
答案 1 :(得分:2)
您可以使用以下表达式简单地做到这一点:
(\[=)(.+)(\])
如果您想添加边界而不是使用(.+)
,则可能要使用表达式并添加[]
之间的任何可能的字符,也许是similar to:
(\[=)([A-z\s\x22]+)(\])
此图显示了第二个表达式的工作方式,您可以在此link中可视化其他表达式:
此代码显示了表达式在Python中的工作方式:
# -*- coding: UTF-8 -*-
import re
string = "[=foo]Lorem ipsum] with anything else that you wish"
expression = r'((\[=)([A-z\s\x22]+)(\]))'
match = re.search(expression, string)
if match:
print("YAAAY! \"" + match.group(1) + "\" is a match ")
else:
print(' Sorry! No matches! Something is not right! Call 911 ')
YAAAY! "[=foo]Lorem ipsum]" is a match
此JavaScript代码段使用简单的100万次for
循环来显示表达式的性能。
repeat = 1000000;
start = Date.now();
for (var i = repeat; i >= 0; i--) {
var string = "[=foo]Lorem ipsum] with anything else that you wish";
var regex = /((\[=)([A-z\s\x22]+)(\]))(.*)/g;
var match = string.replace(regex, "$1");
}
end = Date.now() - start;
console.log("YAAAY! \"" + match + "\" is a match ");
console.log(end / 1000 + " is the runtime of " + repeat + " times benchmark test. ");
答案 2 :(得分:1)
如果将(.+)
设置为非(.+?)
,则可以避免将其余的字符串混为一谈:
\[=([\"']?)(.+?)\1\]/
^
答案 3 :(得分:1)
您的正则表达式工作正常,其与第二行匹配的原因是,您已启用DOTALL
模式,因为.
也与换行符匹配。只需取消选中DOTALL
模式即可禁用s
模式,您将获得预期的结果。
Regex Demo after disabling DOTALL mode
此外,在第三个示例中,我不确定您是否希望正则表达式完全匹配,但是如果您只想匹配[=foo]
而不匹配[=foo]Lorem ipsum]
,那么您会应该在正则表达式中使用[^[\]]+
而不是.+
。
另外,由于字符串似乎被"
或'
包围,或者双方都没有,所以您似乎想匹配它,因此您还应该包括"
和{ {1}}在否定的字符类中,因此您的正则表达式不应与像'
这样的输入匹配。总的来说,您应该使用的正确正则表达式是这个