尝试重新编辑我想拆分“(”“)”“&&” “||” 从我的字符串
我原来的问题: Separating numbers from other signs in a string 我用这个例子
string text = "(54&&1)||15";
Regex pattern = new Regex(@"\(|\)|&&|\|\||\d+");
Match match = pattern.Match(text);
while (match.Success)
{
Console.WriteLine(match.Value);
match = match.NextMatch();
}
我的问题是我并不总是得到一个只有数字和符号的正确字符串 我可能会得到一个奇怪的字符串,如:
0ò8F&|&&booBl||aBla
我希望将其分开
0ò8F&| && booBl || aBla
答案 0 :(得分:2)
它不起作用的原因是,假设您在接受的答案中使用Jon Skeet提供的正则表达式,那么您不会在字符串中查找该公式。给出的正则表达式是:
\(|\)|&&|\|\||\d+
这样找:
NODE EXPLANATION
\( '('
| OR
\) ')'
| OR
&& '&&'
| OR
\|\| '||'
| OR
\d+ digits (0-9) (1 or more times (matching
the most amount possible))
(由http://rick.measham.id.au/paste/explain.pl提供)略有修改。
正如你所看到的,这与“&”无法匹敌或“1& 2”所以如果你需要它,你需要在正则表达式中包含这些值。
这个正则表达式依赖于你原来的陈述:
我有一个包含以下内容的字符串:
“(”“)”“&&” “||”
和数字(0到99999)。
字符串中失败的单个&
与上述内容不匹配。事实上,您可以拥有上述四个字符串标记,然后是其他任何文本,还是存在数字和可选单&
等限制?如果是这样,那么这实际上是与原始问题不同的问题......
如果您希望将这四个内容用作任意文本的分隔符,那么Regex.Split可能就是前进之路(http://msdn.microsoft.com/en-us/library/8yttk7sy.aspx).
string[] results = Regex.Split(@"(54&1&1)||15", @"(\()|(\))|(&&)|(\|\|)");
上面应该将第一个字符串拆分为四个指定的分隔符(“(”“)”“&&”“||”)并且将所有拆分字符串和分隔符本身分开。您可能遇到的一个问题是,如果两个分隔符相邻,那么您将在阵列中获得一个需要考虑的空值。
以上结果是:
0 -
1 - (
2 - 54&1&1
3 - )
4 -
5 - ||
6 - 15
这也不适用于.NET 1.0或1.1,但我希望这不会有问题。
应该注意的是,正则表达式已经稍微改变,将括号中的所有捕获括起来,使它们捕获组并删除仅用于不是分隔符的任何内容的\ d +组。
要从数组中删除空白条目,您只需要一行代码,如:
results = results.Where(x=>!String.IsNullOrEmpty(x)).ToArray();
当然,如果您实际上不需要它作为数组,您可以将其保留为IEnumberable或类似。
答案 1 :(得分:0)
List<string> sList = new List<string>();
Regex pattern = new Regex(@"\(|\)|&&|\|\||\d+");
Match match = pattern.Match(text);
while (match.Success)
{
sList.Add(match.Value);
//Console.WriteLine(text2[nCounter]);
match = match.NextMatch();
}string text = "(54&&1)||15";
sList 包含您想要的输出
答案 2 :(得分:0)
您是否尝试过我对原始问题的回答?
请参阅:Separating numbers from other signs in a string
它解决了你的问题。
var operators = new [] { "(", ")", "&&", "||", };
Func<string, IEnumerable<string>> operatorSplit = t =>
{
Func<string, string, IEnumerable<string>> inner = null;
inner = (p, x) =>
{
if (x.Length == 0)
{
return new [] { p, };
}
else
{
var op = operators.FirstOrDefault(o => x.StartsWith(o));
if (op != null)
{
return (new [] { p, op }).Concat(inner("", x.Substring(op.Length)));
}
else
{
return inner(p + x.Substring(0, 1), x.Substring(1));
}
}
};
return inner("", t).Where(x => !String.IsNullOrEmpty(x));
};
var list = operatorSplit("0ò8F&|&&booBl||aBla").ToList();
结果:{ "0ò8F&|", "&&", "booBl", "||", "aBla" }
答案 3 :(得分:0)
这将满足您的要求:
@"\(|\)|&&|\|\||.+?(?=\(|\)|&&|\|\||$)"
它将\d+
前一个模式中的.+?(?=\(|\)|&&|\|\||$)
字符集替换为{{1}},它使用正向前瞻来指示引擎捕获所有内容,但不包括您的运算符令牌。