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

标签 c# regex

假设我有以下字符串:

xx##a#11##yyy##bb#2##z

我正在尝试检索所有出现的 ##something#somethingElse##

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

我尝试使用

获取所有匹配项
Regex.Matches(MyString, ".*(##.*#.*##).*")

但它会检索一个匹配项,即整行。

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

最佳答案

既然你有.*在你的模式的开头和结尾,你只会得到整行匹配。此外,.*中间# s 在你的模式中太贪婪了,当在一行中遇到时,会把所有预期的匹配都抓到 1 个匹配中。

你可以使用

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

参见 regex demo

注意:如果 ## 之间必须至少有 1 个字符和 # , 和 ### , 替换 * + 的量词(匹配 0 次以上)量词(匹配出现次数超过 1 次)。

注意 2: 避免在 ####..#....##### 内匹配,您可以添加环视:"(?<!#)##[^#]+#[^#]+##(?!#)"

图案细节:

  • ## - 2 #符号
  • [^#]*/[^#]+ - 一个 negated character class匹配 # 以外的 0+ 个字符(或 1+ 个字符)
  • # - 单个 #
  • [^#]*/[^#]+ - 除 # 以外的 0+(或 1+)个字符
  • ## - 双#符号。

奖励:获取里面的内容#### ,使用捕获组,一对未转义的 (...)在需要提取的图案部分周围,然后抓取 Match.Groups[1].Value小号:

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

关于c# - 如何在字符串中查找所有匹配项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43782396/

相关文章:

c# - 如何检测TextBox中的特殊符号?

c# - “80040154 Class not registered” 与来自 C# 的 Word 互操作

c# - 每个实体的 EF6 Code First 审计表

正则表达式因 html 片段而失败

java - Java中的正则表达式: Validating user input

c# - Lottie.Forms - 从 EmbeddedResources 加载

c# linq combine 2 字典

c++ - 如何使用 Regex 分隔此字符串

C# Regex - 接受字符串中的空格

sql - postgresql 9.5 : trying to split a string into two fields based on spaces