2010-12-21 65 views
1

我想我需要一些正则表达式帮助。我想查找像<?abc?>这样的所有标签,以便我可以用代码运行的结果替换它。我只需要帮助重新编码标记/代码字符串,而不是解析里面的代码:p。在html文档中查找/解析服务器端<?abc?> -like标签

<b><?abc print 'test' ?></b>会导致<b>test</b>

编辑:不明确,但一般来讲,匹配(<?[chars] (code group) ?>)

+0

你的意思是,它总是有一个打印“东西”,你会想更换整个用'东西'? – 2010-12-21 07:20:40

+0

我不是C#专家,但概念应该像这样工作。使用某种搜索/查找功能查找<?abc print'。然后,存储该位置。从那里,找到下一个'发生了什么(为了逃避,找到下一个'没有\'的字符在它之前[\'=转义])。或者找到'?>。从那里,从位置和位置2之间的长度开始,使用第一个位置的子串函数,结果将成为“print”'“标记中的结果。 – RageD 2010-12-21 07:22:55

+0

我想要我自己的类型的标签,我可以找到并将代码内容分组到。 '(<?php(code group)?>)' – Iggyhopper 2010-12-21 07:28:32

回答

2

这将建立字符串source的新副本,用process(code)

Regex abcTagRegex = new Regex(@"\<\?abc(?<code>.*?)\?>"); 

StringBuilder newSource = new StringBuilder(); 
int curPos = 0; 

foreach (Match abcTagMatch in abcTagRegex.Matches(source)) { 
    string code = abcTagMatch.Groups["code"].Value; 
    string result = process(code); 

    newSource.Append(source.Substring(curPos, abcTagMatch.Index)); 
    newSource.Append(result); 
    curPos = abcTagMatch.Index + abcTagMatch.Length; 
} 

newSource.Append(source.Substring(curPos)); 
source = newSource.ToString(); 

注:结果替换<?abc code?>我还没有能够测试这些代码,所以一些函数可能有点错误,或者可能会有一些错误。

+1

我通常不会主张使用'。*?',但是所有可以想到的'所有与这一系列角色'相匹配的替代方案都过于复杂,乱。 – ICR 2010-12-21 12:15:17

+0

*我想要一切!但很少有!*嘿嘿 – 2010-12-21 18:44:09

+0

如果我只是做了代码组的输出,它似乎'<?abc echo'?>'; ?>'echo in'echo''; ?>'。你也错过了第二到最后一行paren。这是一个好的开始,但我认为我已经足够了解这个错误。 – Iggyhopper 2010-12-21 20:03:30

0
exp = new Regex(@"<\?abc print'(.+)' \?>"); 
str = exp.Replace(str, "$1") 

像这样的东西应该做的伎俩。更改正则表达式如何您认为合适

1
var new Regex(@"<\?(\w+) (\w+) (.+?)\?>") 

这将以此为源

<b><?abc print 'test' ?></b> 

,并打破它,就像这样:

Value: <?abc print 'test' ?> 

    SubMatch: abc 
    SubMatch: print 
    SubMatch: 'test' 

这些就被发送到处理它的方法不同,这取决于什么零件是。

如果你需要更高级的语法处理,你需要超越正则表达式我相信。

我设计使用Antlr模板引擎,但多数民众赞成的方式更加复杂;)