求一正则表达式,按“-”分割成数组:
如:A-B-C,分割成 A,B,C的数组
1-2-C,分割成1,2,C的数组
1-[1-10,11]-3 分割成,1,[1-10,11],3
B-11-[1,2,3] 分割成,B,11,[1,2,3]
[1-10]-[2-3]-0 分割成,[1-10],[2-3],0
整体意思就是按-分割,但是中括号[]里面的-不参与分割,求大神帮写一个正则表达式
正则表达式太难写了,也许不用非得用正则表达式
其他也没好的思路,能指点一下吗
@狼性法则: 1-[1-10,11]-3 分割成,1,[1-10,11],3后,[1-10,11]还继续分吗?
@会长: 不分了
@狼性法则: 中括号里还会嵌套中括号吗?
@会长:不会嵌套了
@狼性法则: 好,等我操作
@狼性法则:
using System;
using System.Collections.Generic;
using System.Text.RegularExpressions;
namespace MySpliter
{
/// <summary>
/// 记得给我园豆
/// </summary>
internal class Program
{
// 我是测试工具人
static void Main(string[] args)
{
string str = "-212-3-[a-b-c]-c-";
var array = Split(str);
WriteLineResult(str, array);
str = "[a]--[b-c]-d";
array = Split(str);
WriteLineResult(str, array);
str = "abc-[[ab]-[a]--[b-c]-d";
array = Split(str);
WriteLineResult(str, array);
str = "abc-[[ab]]-[a]--[b-c]-d";
array = Split(str);
WriteLineResult(str, array);
str = "a-b-c";
array = Split(str);
WriteLineResult(str, array);
Console.ReadLine();
}
// 我是主角
static string[] Split(string str)
{
if (string.IsNullOrWhiteSpace(str))
{
return null;
}
str = str.Trim('-'); // 去掉首尾的-
str = Regex.Replace(str, @"\-+", "-"); // 将多个相邻的-替换为一个-
List<string> list = new List<string>();
int startIndex = 0;
int currentIndex = 0;
while (true)
{
currentIndex++;
if (currentIndex == str.Length)
{
break;
}
if (str[currentIndex] == '[')
{
int? firstRightBracketIndex = GetFirstRightBracketIndex(str, currentIndex);
if (firstRightBracketIndex != null)
{
currentIndex = firstRightBracketIndex.Value;
}
}
if (str[currentIndex] == '-')
{
list.Add(str.Substring(startIndex, currentIndex - startIndex));
startIndex = currentIndex + 1;
}
else if (currentIndex == str.Length - 1)
{
list.Add(str.Substring(startIndex, currentIndex - startIndex + 1));
}
}
return list.ToArray();
}
// 从当前位置往右找到第一个右括号
private static int? GetFirstRightBracketIndex(string str, int currentIndex)
{
for (int i = currentIndex + 1; i < str.Length; i++)
{
if (str[i] == ']')
{
return i;
}
}
return null;
}
// 打印源字符串和分隔后的结果
private static void WriteLineResult(string str, string[] array)
{
Console.WriteLine();
Console.WriteLine(str);
WriteLineArray(array);
}
// 打印数组
private static void WriteLineArray(string[] array)
{
foreach (var item in array)
{
Console.Write(item);
Console.Write(",");
}
Console.Write("\n");
}
}
}
@狼性法则: @wang_yb 写的正则表达式比我的答案好,建议使用这个正则表达式吧,可以少写很多代码。
@会长: 有种情况不行,有问题[[1-3,4,5]--,这种【1-3】内部成1,3,4,5了
@狼性法则: 哦,那改改吧。我不擅长写正则表达式
你好,这个也许能满足你的要求。
\[[^\[\]]+\]|[^-]+
彩,试了可以。
@会长: 我试了貌似不行啊
@狼性法则: 我试了可以:
static void Main(string[] args)
{
string str = "-212-3-[a-b-c]-c-";
List<string> list = new List<string>();
var matches = Regex.Matches(str, @"\[[^\[\]]+\]|[^-]+");
foreach (Match match in matches)
{
list.Add(match.Value);
}
WriteLineArray(list.ToArray());
Console.ReadLine();
}
@会长: 确实可以
大佬谢谢了,,可是已经结贴了,再次感谢,不好意思了
@狼性法则: 没事,能用就行,积分无所谓的
大佬在吗,能帮我在改改这个表达式吗,1-[2-3][4-5],这种情况拆错了,拆成,1,[2,3],[4,5]三个了,需要拆成1,[2,3][4,5]两组,实在不好意思了