将字符串中的某些符号与其他符号分开
本文关键字:符号 其他 字符串 | 更新日期: 2023-09-27 18:07:41
试图重新演绎我想拆分"("("&&"||"从我的字符串
我最初的问题:将数字与字符串中的其他符号分开我用这个例子
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
它不起作用的原因是,假设您在接受的答案中使用了 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();
当然,如果您实际上不需要它作为数组,则可以将其保留为IE编号或类似内容。
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 包含您想要的输出
你试过我对你最初问题的回答吗?
请参阅: 将数字与字符串中的其他符号分开
它解决了您的问题。
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" }
这将按照您的要求进行操作:
@"'(|')|&&|'|'||.+?(?='(|')|&&|'|'||$)"
它将先前模式中的'd+
字符集替换为 .+?(?='(|')|&&|'|'||$)
,该使用积极的前瞻来指示引擎捕获运算符令牌之前的所有内容,但不包括运算符令牌。