C# 奇数regexp行为-仅匹配第一个和最后一个捕获组
我正在尝试编写一个regexp,它将匹配逗号分隔的单词列表并捕获所有单词。这条线应该是苹果、香蕉、橘子、花生,捕获的应该是苹果、香蕉、橘子、花生。为此,我使用以下regexp:C# 奇数regexp行为-仅匹配第一个和最后一个捕获组,c#,regex,perl,capture,C#,Regex,Perl,Capture,我正在尝试编写一个regexp,它将匹配逗号分隔的单词列表并捕获所有单词。这条线应该是苹果、香蕉、橘子、花生,捕获的应该是苹果、香蕉、橘子、花生。为此,我使用以下regexp: ^\s*([a-z_]\w*)(?:\s*,\s*([a-z_]\w*))*\s*$ 它成功地匹配了字符串,但突然只捕获了apple和peant。这种行为在C#和Perl中都可以看到。因此,我假设我遗漏了一些关于regexp匹配如何工作的信息。有什么想法吗?:) 是的,在每次重复匹配时,上一个内容都会被覆盖。因此,最后
^\s*([a-z_]\w*)(?:\s*,\s*([a-z_]\w*))*\s*$
它成功地匹配了字符串,但突然只捕获了apple
和peant
。这种行为在C#和Perl中都可以看到。因此,我假设我遗漏了一些关于regexp匹配如何工作的信息。有什么想法吗?:) 是的,在每次重复匹配时,上一个内容都会被覆盖。因此,最后只有第二个捕获组的最后一个匹配项可用
您可以将第二个捕获组更改为
^\s*([a-z_]\w*)((?:\s*,\s*(?:[a-z_]\w*))*)\s*$
第二组的结果是“香蕉、橘子、花生”。我不确定,如果你想要这个
如果要检查字符串是否具有该模式并提取每个单词。我会分两步来做
\s*,\s*
上删除前导和尾随空格并拆分match.Groups[2]给出的值就是第二个组捕获的最后一个值
要查找所有值,请查看match.Groups[2]。捕获[i]。值
,在本例中,i
的范围为0
到2
。(以及第一组的match.Groups[1]。值
)
(+1作为问题,我今天学到了一些东西!)试试这个:
string text = " apple , banana ,orange,peanut";
var matches = Regex.Matches(text, @"\s*(?<word>\w+)\s*,?")
.Cast<Match>()
.Select(x => x.Groups["word"].Value)
.ToList();
string text=“苹果、香蕉、橘子、花生”;
var matches=Regex.matches(文本,@“\s*(?\w+)\s*,?”)
.Cast()
.选择(x=>x.Groups[“word”].值)
.ToList();
简单正则表达式:
(?:^ |*)(.+?)(?:,|$)
说明:
?: # Non capturing group
^| * # Match start of line or multiple spaces
.+ # Capture the word in the list, lazy
?: # Non capture group
,|$ # Match comma or end of line
注:这是一个很好的网站,用于测试这类东西 +1我不确定.net是否有此功能,并且懒得检查。@stema我甚至没有意识到这是一个问题,我以为所有的值都会出现在组中!感谢您给我指出。捕获收藏!最终,我想到了使用与我在问题中提出的相同的regexp,然后我为(int I=1;I
PS:这是一个在.NET中测试正则表达式的好网站:我喜欢。谢谢@bazzilic和ChankeyPathak,我不知道那些网站。