繁体   English   中英

正则表达式获取具有特定开始和结束每个组的组块

[英]Regex get group block with specific start and end each group

如果我们有一些像这样的字符串:

----------DBVer=1
/*some sql script*/
----------DBVer=1
----------DBVer=2
/*some sql script*/
----------DBVer=2
----------DBVer=n
/*some sql script*/
----------DBVer=n

我们可以使用正则表达式提取第一个DBVer = 1和第二个DBVer = 1之间的脚本,以此类推吗?

我想如果必须看到DBVer = digitA选择字符串直到DBVer = digitA,如果看到DBVer = digitB选择字符串直到DBVer = digitB,我们必须为正则表达式和tel regex引擎提供一些占位符...

我们可以用正则表达式来实现吗?

是的,使用反向引用和环顾四周,您可以捕获脚本:

var pattern = @"(?<=(?<m>-{10}DBVer=\d+)\r?\n).*(?=\r?\n\k<m>)";
var scripts = Regex.Matches(input, pattern, RegexOptions.Singleline)
                .Cast<Match>()
                .Select(m => m.Value);

在这里,我们使用(?<m>-{10}DBVer=\\d+)捕获m (标记)组,然后稍后在正则表达式中使用\\k<m>重用m值以匹配结束标记。

为了使.*匹配换行符,必须打开Singleline模式。 反过来,这意味着我们必须对换行符进行具体说明。 Singleline模式下,可以使用\\r?\\n以非平台特定的方式解决这些问题。

请尝试以下代码。 不是RegEx,但效果很好。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;
using System.Text.RegularExpressions;


namespace ConsoleApplication6
{
    class Program
    {
        const string FILENAME = @"c:\temp\test.txt";
        static void Main(string[] args)
        {

            Script.ReadScripts(FILENAME);   
        }
    }
    public class Script
    {
        enum State
        {
            Get_Script,
            Read_Script
        }

        public static List<Script> scripts = new List<Script>();
        public int version { get; set; }
        public string script { get; set; }

        public static void ReadScripts(string filename)
        {
            string inputLine = "";
            string pattern = "DBVer=(?'version'\\d+)";
            State state = State.Get_Script;
            StreamReader reader = new StreamReader(filename);
            Script newScript = null;
            while ((inputLine = reader.ReadLine()) != null)
            {
                inputLine = inputLine.Trim();
                if (inputLine.Length > 0)
                {
                    switch (state)
                    {
                        case State.Get_Script :
                            if(inputLine.StartsWith("-----"))
                            {
                                newScript = new Script();
                                scripts.Add(newScript);
                                string version = 
                                  Regex.Match(inputLine, pattern).Groups["version"].Value;
                                newScript.version = int.Parse(version);
                                newScript.script = "";
                                state = State.Read_Script;
                            }
                            break;
                        case State.Read_Script :
                            if (inputLine.StartsWith("-----"))
                            {
                                state = State.Get_Script;
                            }
                            else
                            {
                                if (newScript.script.Length == 0)
                                {
                                    newScript.script = inputLine;
                                }
                                else
                                {
                                    newScript.script += "\n" + inputLine;
                                }
                            }
                            break;

                    }
                }
            }
        }
    }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM