【问题标题】:C# RegEx.Split delimiter followed by specific wordsC# RegEx.Split 分隔符后跟特定单词
【发布时间】:2018-04-17 21:44:37
【问题描述】:

我正在尝试使用 Regex.Split 这样的字符串进行拆分:

string criteria = "NAME='Eduard O' Brian'   COURSE='Math II' TEACHER = 'Chris Young' SCHEDULE='3' CAMPUS='C-1' ";

我们有以下'保留字':NAME, COURSE, TEACHER, SCHEDULE, CAMPUS. 需要将原字符串拆分成:

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

它正在删除最后一个简单的引号,并且只使用保留字的第一个字母。并且此示例中的 COURSE 有多个空格,并且不适用于它。

提前致谢!

【问题讨论】:

  • 你的代码现在做什么?不工作怎么办?
  • 您放在方括号[ ] 内的任何内容都将匹配其中的任何单个字符。 [NAME] 将匹配“N”、“A”、“M”和“E”
  • 你的criteria格式不一致;您需要将 O'Brian 等 NAME 中的撇号与用于分隔字段的撇号区分开来。
  • 谢谢大家。 @DourHighArch 因为这是一个遗留应用程序,所以我无法更改使用撇号作为分隔符。这是因为我打算用下一个“保留词”作为区分句子的方式
  • 首先,将[NAME]|[COURSE]|[TEACHER]|[SCHEDULE]|[CAMPUS] 更改为NAME|COURSE|TEACHER|SCHEDULE|CAMPUS。正如@MattiPrice 指出的那样,您现在拥有的是character class,它匹配[ ] 中的任何字符

标签: c# regex split


【解决方案1】:

您可以简单地用 1+ 个空格分隔,然后是保留字,然后是 =

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

regex demo

模式详情

  • \s+ - 1 个或多个空格字符
  • (?= - 正向前瞻的开始,紧邻当前位置的右侧,需要以下文本:
    • (?:NAME|COURSE|TEACHER|SCHEDULE|CAMPUS) - 任何替代文字
    • \s* - 0 个或多个空白字符(因为保留字和 = 之间可以有空格)
    • = - 等号
  • ) - 前瞻结束。

C# demo:

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

【讨论】:

  • 测试并得到与您相同的结果,COURSE 和 TEACHER 在同一行。 dotnetfiddle.net/gueMJ4
  • @BasicIsaac =前面有空格,在里面加上\s*
  • 删除 TEACHER 和 = 之间的空格修复它,但我不知道这是否是 @Mercy 的选项
  • @BasicIsaac 不删除,添加模式以匹配保留字和= 之间的 0+ 个空白字符。我更新了答案。
猜你喜欢
  • 2015-07-27
  • 1970-01-01
  • 2013-03-18
  • 2013-05-21
  • 1970-01-01
  • 2021-03-02
  • 1970-01-01
  • 1970-01-01
  • 2013-01-10
相关资源
最近更新 更多