c# - 如何匹配所有正则表达式组之间有或没有字符

标签 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 进行全局匹配

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

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

最佳答案

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

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

参见demo here .

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

编辑:

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

关于c# - 如何匹配所有正则表达式组之间有或没有字符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29606434/

相关文章:

c# - 添加扩展方法的方法?

javascript - 仅匹配多行字符串的起始 anchor

c# - 等待通知异步调用

c# - IIS 中的 "An existing connection was forcibly closed by the remote host"错误,但不是 VS 开发服务器

android - 正则表达式捕获不等于等值字符串

Python:匹配 BeautifulSoup 文本中的正则表达式

javascript - 新的正则表达式。测试

MySQL 在 SELECT 中提取多个子字符串,任意次数

c# - Fluent NHibernate AutoMapping,应该可以节省时间,但这让我很抓狂

c# - 验证当前文化中的双数