以下是我正在使用
的字符串示例{Hi|Hello|Holla} {James{ey|o|ing}|Bob{bie|bey}}
我需要一个正则表达式来提取{}的例子之间的值:
Hi|Hello|Holla
James{ey|o|ing}
Bob{bie|bey}
原始字符串称为Spintax。我的程序将选择每个{}块中包含的随机值。嵌套的{}块可以非常深入。
正则表达式需要在{}忽略任何嵌套{}块之间提取值。然后,再次通过管道(|)拆分值,忽略任何嵌套的{}块,以便不触及嵌套{}块中的管道。
这有意义吗?
我确实使用String方法实现了部分解决方案,但是当通过管道拆分时,它也会在嵌套的{}中拆分管道,这是可以预料到的,但我无法找到一种方法来忽略嵌套{} < / p>
public String spintaxParse(String s)
{
// TODO: Implement logic to check for {} within String.
if (s.Contains('{'))
{
int firstOccuranceOfOpenBrace = s.IndexOf('{');
while (s[firstOccuranceOfOpenBrace + 1].Equals('{'))
firstOccuranceOfOpenBrace++;
int firstOccuranceOfClosingBrace = s.Substring(firstOccuranceOfOpenBrace).IndexOf('}');
String spintaxBlock = s.Substring(firstOccuranceOfOpenBrace, firstOccuranceOfClosingBrace + 1);
String[] items = spintaxBlock.Substring(1, spintaxBlock.Length - 2).Split('|');
Random rand = new Random();
s = s.Replace(spintaxBlock, items[rand.Next(items.Length)]);
return spintaxParse(s);
}
else
{
return s;
}
}
答案 0 :(得分:1)
由于您正在处理多嵌套语法,我认为您可能希望使用Parser Generation Tool创建一个简单的解析器,例如“ANTLR”。 ANTLR Link
ANTLR语法应该是这样的:
statements: statement+
;
statement: '{'+ content + '}'
;
content: token
| TOKEN + '|' + content
| TOKEN + '|' + statement
;
TOKEN: \w+
;
答案 1 :(得分:0)
用手或某些解析器生成器解析字符串可能更容易。
对于匹配平衡括号的正则表达式,请查看此答案 - Regular expression for String.Format-like utility以及相关的MSDN文章http://msdn.microsoft.com/en-us/library/bs2twtah.aspx#balancing_group_definition。