C#RegEx.分隔符,后跟特定单词

C#RegEx.分隔符,后跟特定单词,c#,regex,split,C#,Regex,Split,我正在尝试使用Regex.split字符串进行拆分,如下所示: string criteria = "NAME='Eduard O' Brian' COURSE='Math II' TEACHER = 'Chris Young' SCHEDULE='3' CAMPUS='C-1' "; 我们有以下“保留字”:姓名、课程、教师、时间表、校园。需要将原始字符串拆分为: NAME='Eduard O' Brian' COURSE='Math II' TEACHER = 'Chris Young'

我正在尝试使用
Regex.split
字符串进行拆分,如下所示:

string criteria = "NAME='Eduard O' Brian'   COURSE='Math II' TEACHER = 'Chris Young' SCHEDULE='3' CAMPUS='C-1' ";
我们有以下“保留字”:
姓名、课程、教师、时间表、校园。
需要将原始字符串拆分为:

NAME='Eduard O' Brian'
COURSE='Math II'
TEACHER = 'Chris Young'
SCHEDULE='3'
CAMPUS='C-1'
Split
的标准是:使用简单引号,后跟一个或多个空格,后跟一个“保留字”

我得到的最接近的表达是:

var match = Regex.Split(criteria, @"'[\s+]([NAME]|[COURSE]|[TEACHER]|[SCHEDULE]|[CAMPUS])", RegexOptions.CultureInvariant);
这是完整的源代码:

using System;
using System.Text.RegularExpressions;
namespace ConsoleApplication
{
    class Program
    {
        static void Main(string[] args)
        {
            string criteria = "NAME='Eduard O' Brian'  COURSE='Math II' TEACHER = 'Chris Young' SCHEDULE='3' CAMPUS='C-1' ";

            var match = Regex.Split(criteria, @"'[\s+]([NAME]|[COURSE]|[TEACHER]|[SCHEDULE]|[CAMPUS])", RegexOptions.CultureInvariant);

            foreach (var item in match)
                Console.WriteLine(item.ToString());

            Console.Read();
        }
    }
}
我的代码是这样做的:

NAME='Eduard O' Brian'   COURSE='Math II
T
EACHER = 'Chris Young
S
CHEDULE='3
C
AMPUS='C-1
它删除了最后一个简单的引号,只取保留字的第一个字母。本示例中的课程有多个空间,不适用于它


提前谢谢

您可以简单地拆分为1+个空格,后跟保留字,后跟
=

var results = Regex.Split(s, @"\s+(?=(?:NAME|COURSE|TEACHER|SCHEDULE|CAMPUS)\s*=)");

图案细节

  • \s+
    -1个或多个空白字符
  • (?=
    -立即在当前位置右侧开始正向前瞻,需要以下文本:
    • (?:姓名|课程|教师|课程表|校园)
      -任何替代文字文本
    • \s*
      -0个或多个空格字符(因为保留字和
      =
      之间可能有空格)
    • =
      -等号
  • -前瞻的结束
:


您的代码现在做什么?如果它不起作用呢?放在方括号内的任何东西都将匹配其中的任何单个字符
[NAME]
将与“N”、“A”、“M”和“E”匹配您的
标准
格式不一致;您需要区分像O'Brian这样的名字中的撇号和用于分隔字段的撇号。谢谢大家@DourHighArch由于这是一个遗留应用程序,我无法更改撇号作为分隔符的用法。这是因为我计划使用下一个“保留字”作为区分句子的方式。首先,将
[NAME]|[COURSE]|[TEACHER]|[SCHEDULE]|[CAMPUS]
更改为
NAME | COURSE | TEACHER | SCHEDULE | CAMPUS
。正如@MattiPrice所指出的,您现在拥有的是a,它匹配了
[]
测试中的任何字符,并且得到了与您、课程和老师在同一行相同的结果@BasicIsaac在
=
之前有空格,在那里添加
\s*
。删除TEACHER和=之间的空格可以修复它,但我不知道这是否是@Mercy@BasicIsaac不删除,添加一个模式以匹配保留字和
=
之间的0+空格字符。我更新了答案。
var criteria = "NAME='Eduard O' Brian'  COURSE='Math II' TEACHER = 'Chris Young' SCHEDULE='3' CAMPUS='C-1' ";
var match = Regex.Split(criteria, @"\s+(?=(?:NAME|COURSE|TEACHER|SCHEDULE|CAMPUS)\s*=)");
Console.WriteLine(string.Join("\n", match));