如何匹配所有正则表达式组之间是否有字符

时间:2015-04-13 13:23:34

标签: c# regex

这是我的正则表达式

(".+?")*([^{}\s]+)*({.+?})*

通常与此表达式匹配效果很好,但前提是匹配的组之间存在任何字符。例如:

{1.0 0b1 2006-01-01_12:34:56.789} {1.2345 0b100000 2006-01-01_12:34:56.789}

产生两个匹配:

1. {1.0 0b1 2006-01-01_12:34:56.789}
2. {1.2345 0b100000 2006-01-01_12:34:56.789}

但是这个:

{1.0 0b1 2006-01-01_12:34:56.789}{1.2345 0b100000 2006-01-01_12:34:56.789}

只有一个包含最后一场比赛:

{1.2345 0b100000 2006-01-01_12:34:56.789}

PS。我使用开关g进行全局匹配

编辑: 我同时做研究,我必须提供额外的数据。我粘贴了整个正则表达式,它也匹配单词和字符串,因此在组之后的asterix是必要的

EDIT2:以下是示例文字:

COMMAND STATUS {OBJECT1}{OBJECT2} "TEXT" "TEXT"

结果我想要这些小组:

COMMAND
STATUS
{OBJECT1}
{OBJECT2}
"TEXT1"
"TEXT2"

这是我的实际C#代码:

var regex = new Regex("(\".+?\")*([^{}\\s]+)*({.+?})*");
var matches = regex.Matches(responseString);
return matches
   .Cast<Match>()
   .Where(match => match.Success && !string.IsNullOrWhiteSpace(match.Value))
            .Select(match => CommandParameter.Parse(match.Value));

2 个答案:

答案 0 :(得分:3)

您可以使用以下正则表达式捕获所有{...} s:

(".+?"|[^{}\s]+|{[^}]+?})

请参阅demo here

我捕获某些单个字符内的任何内容的方法是使用具有相同字符的否定字符类。此外,由于您要匹配非空文本,因此最好使用+量词来确保至少1个字符匹配。

编辑:

您应该使用替代列表,而不是使每个组都可选。

答案 1 :(得分:1)

*子模式有额外的量词({.+?})

您可以使用此正则表达式:

("[^"]*"|{[^}]*}|[^{}\s]+)

RegEx Demo

并注意它如何匹配两个组之间的空间和一个没有空格的组。