C# 正则表达式匹配具有分隔符的字符串

Posted

技术标签:

【中文标题】C# 正则表达式匹配具有分隔符的字符串【英文标题】:C# regex to match a string which has a delimiter 【发布时间】:2010-10-13 03:48:08 【问题描述】:

我想使用正则表达式在两个特定单词之间获取包含分隔符的字符串。

例如我需要一个匹配的正则表达式:

Statements1 开始 Statements2 ; Statements3 结束乐趣;

在“开始”和“结束”之间可以多次出现“;”。

语句是多个单词,其中 (.*) 可以在一个单词的正则表达式中使用。

但如果“开始”和“结束”之间没有“;”,则正则表达式不匹配。

另外,“end”应该是“start”之后遇到的第一个“end”

所以,正则表达式不应该匹配

Statements1 start Statements2 end Statements3 ;结束乐趣

我希望匹配为

    “开始”之前的陈述 关键字 “开始”之后的语句

因此,在这种情况下,它将是一个组(对于第一个字符串,因为 2nd 不应该匹配):

    声明1 开始 声明2; Statements3 结束乐趣;

【问题讨论】:

【参考方案1】:

因此,下面的正则表达式将匹配您的肯定情况并失败否定情况并将结果放入第 1、2 和 3 组。

(.*?) (start) ((?:(?:.*?) ;)+ (?:.*?) end fun)

如果您不熟悉 (?:) 语法 - 它们表示非捕获括号。 看看Mastering Regular Expressions,这是这个话题的一个很好的参考!

【讨论】:

是的,我更熟悉 ?: 语法。但我很遗憾地说这个正则表达式不起作用。【参考方案2】:
start ((Statements) ;)+ (Statements) end fun

【讨论】:

这不符合捕获要求 发生这种情况时不是很痛苦!【参考方案3】:

使用起来可能会更快

    string[] Strings = stringToSplit.Split(new char[]  ';' );
    if (Strings.Count() > 1)
    
        // Do your stuff
    

【讨论】:

【参考方案4】:

听起来你想要的很简单:

(.*)(start)(.*;.*end.*)

这将返回您列出的组。

【讨论】:

您的 * 需要非贪婪限定符,否则它将匹配最后一个“结束”,而不是第一个。 你是绝对正确的,虽然替换lazy *s 会导致它对最后的“fun;”进行分组与下一场比赛。不确定这有多重要。

以上是关于C# 正则表达式匹配具有分隔符的字符串的主要内容,如果未能解决你的问题,请参考以下文章

如何为逗号分隔的字符串编写具有匹配组的正则表达式

正则表达式从字符串中精确匹配 11 位电话号码并从 C# 中的匹配中删除连字符(-)

C# 正则表达式在 外用逗号分隔

具有特殊字符的正则表达式嵌套结构

匹配 XML 字符串的正则表达式在 C# 中具有开始和结束标记

C#正则表达式