假设我有以下字符串:
XX ##一#11 ## ## YYY BB#2 ##ż
我试图检索所有##something#somethingElse##
(在我的字符串中,我希望有2个匹配:##a#11##
和##bb#2##
)
我尝试使用
获取所有比赛Regex.Matches(MyString, ".*(##.*#.*##).*")
但它检索一个匹配,这是整行。
如何从此字符串中获取所有匹配项?感谢。
答案 0 :(得分:4)
由于您在模式的开头和结尾都有.*
,因此您只能获得整行匹配。此外,你的模式中.*
之间的#
过于贪婪,并且当遇到一行时会将所有预期的匹配抓取到1个匹配中。
您可以使用
var results = Regex.Matches(MyString, "##[^#]*#[^#]*##")
.Cast<Match>()
.Select(m => m.Value)
.ToList();
请参阅regex demo
注意:如果##
和#
之间,#
和##
之间必须至少有1个字符,请替换{{ 1}}量词(匹配0+次出现)与*
量词(匹配1次出现)。
注2:为避免+
内的匹配,您可以添加以下内容:####..#....#####
模式详情:
"(?<!#)##[^#]+#[^#]+##(?!#)"
- 2 ##
个符号#
/ [^#]*
- 除[^#]+
#
- 一个#
#
/ [^#]*
- 除[^#]+
#
- 加倍##
符号。奖励:要获取#
和##
内的内容,请使用捕获组,在模式部分周围使用一对未转义的##
需要提取并抓取(...)
s:
Match.Groups[1].Value
答案 1 :(得分:4)
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)