2010-01-21 32 views
1

我一直在這個表達式:
{link=([^|{}]+)\||([^|{}]+)\||([^|{}]+)}需要向引用匹配有助於在正則表達式

我希望捕捉到任何非管或支架字符並將其放置在適當的反向引用(組)。

我怎樣才能返回如下:

  1. 如果測試字符串是{link=a}回報a成組3
  2. 如果測試字符串是{link=a|b}回報a成2組,b成組3
  3. 如果測試字符串爲{link=a|b|c}則返回a爲組1,b爲組2,c爲組3.

在使用上述正則表達式處理所有排列中字符串未正確拾取到正確組中的問題。我認爲我有支架分組問題和/或OR|)聲明問題。

在此先感謝。

回答

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 
+2

尼斯。但爲什麼你用{0,1}而不是好的'?'? – PhiLho 2010-01-21 07:11:34

+0

沒有很好的理由。我可能只是忘記了;) – 2010-01-21 07:14:54

+1

我冒昧地修復(化妝品),但更重要的是排除管道從第一次捕獲。 – PhiLho 2010-01-21 07:21:12

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]