如何在字符串中查找所有匹配项

时间:2017-05-04 12:03:38

标签: c# regex

假设我有以下字符串:

  

XX ##一#11 ## ## YYY BB#2 ##ż

我试图检索所有##something#somethingElse##

(在我的字符串中,我希望有2个匹配:##a#11####bb#2##

我尝试使用

获取所有比赛
Regex.Matches(MyString, ".*(##.*#.*##).*")

但它检索一个匹配,这是整行。

如何从此字符串中获取所有匹配项?感谢。

2 个答案:

答案 0 :(得分:4)

由于您在模式的开头和结尾都有.*,因此您只能获得整行匹配。此外,你的模式中.*之间的#过于贪婪,并且当遇到一行时会将所有预期的匹配抓取到1个匹配中。

您可以使用

var results = Regex.Matches(MyString, "##[^#]*#[^#]*##")
    .Cast<Match>()
    .Select(m => m.Value)
    .ToList();

请参阅regex demo

注意:如果###之间,###之间必须至少有1个字符,请替换{{ 1}}量词(匹配0+次出现)与*量词(匹配1次出现)。

注2:为避免+内的匹配,您可以添加以下内容:####..#....#####

模式详情

  • "(?<!#)##[^#]+#[^#]+##(?!#)" - 2 ##个符号
  • # / [^#]* - 除[^#]+
  • 以外的negated character class匹配0 +字符(或1 +字符)
  • # - 一个#
  • # / [^#]* - 除[^#]+
  • 以外的0+(或1+)个字符
  • # - 加倍##符号。

奖励:要获取###内的内容,请使用捕获组,在模式部分周围使用一对未转义的##需要提取并抓取(...) s:

Match.Groups[1].Value

答案 1 :(得分:4)

Regex101

Regex.Matches(MyString, "(##[^#]+#[^#]+##)")

(##[^#]+#[^#]+##)

描述

1st Capturing Group (##[^#]+#[^#]+##)
    ## matches the characters ## literally (case sensitive)
    Match a single character not present in the list below [^#]+
        + Quantifier — Matches between one and unlimited times, as many times as possible, giving back as needed (greedy)
    # matches the character # literally (case sensitive)
    # matches the character # literally (case sensitive)
    Match a single character not present in the list below [^#]+
        + Quantifier — Matches between one and unlimited times, as many times as possible, giving back as needed (greedy)
    # matches the character # literally (case sensitive)
    ## matches the characters ## literally (case sensitive)

Regular expression visualization

Debuggex Demo