C#Regex split()而不删除拆分条件字符

C#Regex split()而不删除拆分条件字符,c#,regex,string,split,C#,Regex,String,Split,我使用正则表达式的Split()方法拆分字符串 var splitRegex = new Regex(@"[\s|{]"); string input = "/Tests/ShowMessage { 'Text': 'foo' }"; //second version of the input: //string input = "/Tests/ShowMessage{ 'Text': 'foo' }"; string[] splittedText = splitRegex.Split(

我使用正则表达式的
Split()
方法拆分
字符串

var splitRegex = new Regex(@"[\s|{]");

string input = "/Tests/ShowMessage { 'Text': 'foo' }";

//second version of the input: 
//string input = "/Tests/ShowMessage{ 'Text': 'foo' }";

string[] splittedText = splitRegex.Split(input, 2);
字符串
只是输入的一个示例模式。
input
有两种不同的结构,一种是在
{
前面有空格,另一种是没有空格。我想在
{
括号中拆分
input
,以得到以下结果:

  • /测试/显示消息
  • {'Text':'foo'}

如果有一个空格,字符串会被拆分(空格会被删除),我会得到我想要的结果。但是如果没有空格,我会在
{
上拆分字符串,所以
{
会被删除,这是我不想要的。我如何使用
Regex.split()
在不删除分割条件字符的情况下?

为了不在匹配中包含花括号,您可以将其放在“向前看”中

\s*(?={)

这将匹配任意数量的空格,直到打开大括号之前的位置。

为了不在匹配中包含大括号,您可以将其放在“向前看”中

\s*(?={)

这将匹配任意数量的空格,直到打开大括号之前的位置。

您可以使用规则的字符串拆分,在“{”上并修剪空格:

var bits = "/Tests/ShowMessage { 'Text': 'foo' }".Split("{", StringSplitOptions.RemoveEmptyEntries);
bits[0] = bits[0].TrimEnd();
bits[1] = "{" + bits[1];
如果要使用正则表达式路由,如果稍微更改正则表达式,可以添加{back:

var splitRegex = new Regex(@"\s*{");

string input = "/Tests/ShowMessage { 'Text': 'foo' }";

//second version of the input: 
//string input = "/Tests/ShowMessage{ 'Text': 'foo' }";

string[] splittedText = splitRegex.Split(input, 2);
splittedText[1] = "{" + splittedText[1];

它的意思是“在出现时分割(零个或多个空格后跟{)”-因此分割操作会核化您的空格(您想要的)和{(您不想要的){,但您可以确定地将{放回原处,这将意味着您得到了您想要的

您可以使用常规的字符串分割,在{上并修剪空格:

var bits = "/Tests/ShowMessage { 'Text': 'foo' }".Split("{", StringSplitOptions.RemoveEmptyEntries);
bits[0] = bits[0].TrimEnd();
bits[1] = "{" + bits[1];
如果要使用正则表达式路由,如果稍微更改正则表达式,可以添加{back:

var splitRegex = new Regex(@"\s*{");

string input = "/Tests/ShowMessage { 'Text': 'foo' }";

//second version of the input: 
//string input = "/Tests/ShowMessage{ 'Text': 'foo' }";

string[] splittedText = splitRegex.Split(input, 2);
splittedText[1] = "{" + splittedText[1];

它的意思是“在出现时分割(零个或多个空格后跟{)”——因此分割操作会核化您的空格(您想要的)和{(您不想要的),但您可以将{确定地说,这意味着你得到了你想要的

方括号创建了一个字符集,因此你希望它正好匹配这些内部字符中的一个。为了满足你的愿望,从删除它们开始

因此,为了匹配它,您必须添加一个随机的空白计数
*
,结果是这一个
\s*

  • \s
    是一个空白
  • *
    表示零或更多
如果不删除分割条件字符,则可以使用先行断言
(?=…)

  • (?=…)
    (?!…)
    是一个前瞻性断言
组合的
Regex
如下所示:
\s*(?={)


这是一个非常好的详细的文档,包含了所有不同的
Regex
部分,您可以看看它。此外,您可以轻松免费地测试
Regex

方括号创建了一个字符集,因此您希望它与这些内部字符中的一个完全匹配。为了满足您的需求,可以从删除它们开始。

因此,为了匹配它,您必须添加一个随机的空白计数
*
,结果是这一个
\s*

  • \s
    是一个空白
  • *
    表示零或更多
如果不删除分割条件字符,则可以使用先行断言
(?=…)

  • (?=…)
    (?!…)
    是一个前瞻性断言
组合的
Regex
如下所示:
\s*(?={)


是一个非常好的详细的文档,包含了所有不同的
Regex
部分,您可以看看。此外,您可以轻松免费地测试
Regex

使用。使用。正是我想要的。但是
[]
影响我的正则表达式?在这种特定情况下,我不理解它。这会不会因为管道字符而过度拆分字符串?@L.guthatt方括号用于创建字符集。因此
[\s |{]
实际上将匹配管道字符或大括号中的任何空白。@juharr我问这个问题是因为我尝试了带括号的代码
[\s*(?={)]
,它删除了
{
再次。为什么如果它与大括号前的位置相匹配?@L.Guthatt再次括号是字符集,因此您要求它匹配其中一个字符,除了
\s
之外,它们失去了特殊的含义。这正是我要找的。但是
[]
影响我的正则表达式?在这种特定情况下,我不理解它。这会不会因为管道字符而过度拆分字符串?@L.guthatt方括号用于创建字符集。因此
[\s |{]
实际上将匹配管道字符或大括号中的任何空白。@juharr我问这个问题是因为我尝试了带括号的代码
[\s*(?={)]
,它删除了
{
再次。为什么如果它与大括号前的位置匹配?@L.Guthatt再次说明,括号是字符集,因此您要求它匹配其中一个字符,除了
\s
之外,它们失去了特殊的含义。是的,将其添加回或使用默认的
字符串。可以使用拆分
的方式并生成这是我的结果,但这不是我想要的。它比我显示的更复杂,只是一些简单的示例。是的,将其添加回或使用默认的
字符串。拆分
方式是可能的,并生成我的结果,但这不是我想要的。它比我显示的更复杂,只是一些简单的示例。