我尝试像这样解析字符串:
"#1#Process#{some process|info}{some name|some info {child info|child info}}{some name|some info}"
在多条消息中创建如下字符串:
#1#Process#
-some process|info
-some name|some info
-child info|child info
-some name|some info
我正在尝试使用 RegExp 和以下代码:
using System;
using System.Collections;
using System.Text.RegularExpressions;
namespace prRegEXP
{
class Program
{
static String st="";
public static void Main(string[] args)
{
Console.WriteLine("Hello World!");
// TODO: Implement Functionality Here
var pattern = @"\{(.*?)\}";
var query = "#1#Process#{some process|info}{some name|some info {child info|child info}}{some name|some info}";
FindTree (pattern, query);
Console.WriteLine(st);
Console.WriteLine();
Console.WriteLine("Press any key to continue . . . ");
Console.ReadKey(true);
}
private static void FindTree (String pattern, String query) {
var matches = Regex.Matches(query, pattern);
foreach (Match m in matches) {
st += m.Groups[1] + "\n";
if (Regex.IsMatch(m.Groups[1].ToString(), @"\{(.*?)" )) {
FindTree (@"\{(.*?)", m.Groups[1].ToString());
}
}
}
}
}
它基于 example solution我发现并且想创建一些消息树来处理内部消息(例如child info|child name
)。而且可能有很多。
我无法弄清楚如何匹配子表达式并将其以递归参数发送。有什么想法或修复吗?
最佳答案
编写一个简单的正则表达式来支持 N 深度递归是不可能的(?)或者至少非常困难。
一个更简单的解决方案是逐个字符地遍历字符串,并在发现新消息时插入缩进和换行符。
类似的事情应该有效:
private static String FindTree(String query)
System.Text.StringBuilder sb = new System.Text.StringBuilder();
String indent = "";
foreach (var ch in query) {
if (ch == '{') {
sb.Append("\n");
sb.Append(indent);
sb.Append("- ");
indent += "\t";
} else if (ch == '}') {
indent = indent.Substring(1);
} else {
sb.Append(ch);
}
}
return sb.ToString();
}
上面的代码没有经过测试,我也不精通 C#,所以它可能充满错误,但它应该说明了基本思想。
关于c# - TreeView 的正则表达式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22038875/