我一直在研究这个正则表达式:
{link=([^|{}]+)\||([^|{}]+)\||([^|{}]+)}
我希望捕获任何非管道或括号字符,并将它们放在适当的反向引用(组)中。
如何退回以下内容:
{link=a}
,则将a
返回到第3组。{link=a|b}
将a
返回到第2组,b
返回到第3组。{link=a|b|c}
将a
返回到第1组,b
返回到第2组,c
返回到第3组。在使用上述正则表达式的所有排列中,没有正确地将字符串拾取到正确的组中的问题。我认为我有括号分组问题和/或OR
(|
)语句问题。
提前致谢。
答案 0 :(得分:1)
在python中,但语法应该相同,
#!/usr/bin/python
import re
ptn = re.compile(r"""
{link=
(?:
(?:([^|}]+)\|)?
(?:([^|}]+)\|)
)?
([^|}]+)
}
""", re.VERBOSE)
l = [
"{link=a}",
"{link=a|b}",
"{link=a|b|c}",
"{link=a} {link=a|b} {link=a|b|c}",
]
for s in l:
for m in ptn.finditer(s):
print "%s => matchs: %s => m.group(3): %s" % (
s, m.group(0), m.group(3))
和结果:
{link=a} => matchs: {link=a} => m.group(3): a
{link=a|b} => matchs: {link=a|b} => m.group(3): b
{link=a|b|c} => matchs: {link=a|b|c} => m.group(3): c
{link=a} {link=a|b} {link=a|b|c} => matchs: {link=a} => m.group(3): a
{link=a} {link=a|b} {link=a|b|c} => matchs: {link=a|b} => m.group(3): b
{link=a} {link=a|b} {link=a|b|c} => matchs: {link=a|b|c} => m.group(3): c
答案 1 :(得分:1)
如何捕获同一组中的所有匹配项?
string[] tests = {
"{link=a}",
"{link=a|b}",
"{link=a|b|c}",
};
var link = @"(?<link>[^|]+)";
var pattern = new Regex(String.Format(@"^\{{link={0}(\|{0})*\}}$", link));
foreach (var s in tests) {
Match m = pattern.Match(s);
if (!m.Success) {
Console.WriteLine("{0}: FAIL", s);
continue;
}
Console.Write("{0}: PASS ", s);
foreach (var l in m.Groups["link"].Captures)
Console.Write("[{0}]", l);
Console.WriteLine();
}
输出:
{link=a}: PASS [a] {link=a|b}: PASS [a][b] {link=a|b|c}: PASS [a][b][c]