假设我有以下字符串:
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/