首页 新闻 会员 周边 捐助

求一个正则表达式,各位大神帮忙

0
悬赏园豆:20 [已解决问题] 解决于 2022-08-22 09:33

求一正则表达式,按“-”分割成数组:
如: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

整体意思就是按-分割,但是中括号[]里面的-不参与分割,求大神帮写一个正则表达式

狼性法则的主页 狼性法则 | 初学一级 | 园豆:56
提问于:2022-08-19 10:01
< >
分享
最佳答案
0

正则表达式太难写了,也许不用非得用正则表达式

收获园豆:20
会长 | 专家六级 |园豆:12463 | 2022-08-19 14:04

其他也没好的思路,能指点一下吗

狼性法则 | 园豆:56 (初学一级) | 2022-08-19 14:04

@狼性法则: 1-[1-10,11]-3 分割成,1,[1-10,11],3后,[1-10,11]还继续分吗?

会长 | 园豆:12463 (专家六级) | 2022-08-19 14:05

@会长: 不分了

狼性法则 | 园豆:56 (初学一级) | 2022-08-19 14:06

@狼性法则: 中括号里还会嵌套中括号吗?

会长 | 园豆:12463 (专家六级) | 2022-08-19 14:13

@会长:不会嵌套了

狼性法则 | 园豆:56 (初学一级) | 2022-08-19 14:20

@狼性法则: 好,等我操作

会长 | 园豆:12463 (专家六级) | 2022-08-19 14:21

@狼性法则:

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");
       }
    }
}

会长 | 园豆:12463 (专家六级) | 2022-08-19 15:31

@狼性法则: @wang_yb 写的正则表达式比我的答案好,建议使用这个正则表达式吧,可以少写很多代码。

会长 | 园豆:12463 (专家六级) | 2022-08-22 11:12

@会长: 有种情况不行,有问题[[1-3,4,5]--,这种【1-3】内部成1,3,4,5了

狼性法则 | 园豆:56 (初学一级) | 2022-08-22 11:33

@狼性法则: 哦,那改改吧。我不擅长写正则表达式

会长 | 园豆:12463 (专家六级) | 2022-08-22 12:45
其他回答(1)
0

你好,这个也许能满足你的要求。

\[[^\[\]]+\]|[^-]+
wang_yb | 园豆:4893 (老鸟四级) | 2022-08-19 15:43

彩,试了可以。

支持(0) 反对(0) 会长 | 园豆:12463 (专家六级) | 2022-08-19 16:11

@会长: 我试了貌似不行啊

支持(0) 反对(0) 狼性法则 | 园豆:56 (初学一级) | 2022-08-22 11:13

@狼性法则: 我试了可以:

        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();
        }
支持(0) 反对(0) 会长 | 园豆:12463 (专家六级) | 2022-08-22 11:17

@会长: 确实可以

支持(0) 反对(0) 狼性法则 | 园豆:56 (初学一级) | 2022-08-22 11:24

大佬谢谢了,,可是已经结贴了,再次感谢,不好意思了

支持(0) 反对(0) 狼性法则 | 园豆:56 (初学一级) | 2022-08-22 11:25

@狼性法则: 没事,能用就行,积分无所谓的

支持(0) 反对(0) wang_yb | 园豆:4893 (老鸟四级) | 2022-08-22 22:05

大佬在吗,能帮我在改改这个表达式吗,1-[2-3][4-5],这种情况拆错了,拆成,1,[2,3],[4,5]三个了,需要拆成1,[2,3][4,5]两组,实在不好意思了

支持(0) 反对(0) 狼性法则 | 园豆:56 (初学一级) | 2022-09-02 09:04
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册