2011-12-07 27 views
2

我一直在玩正在使用正则表达式从字符串检索数据,主要是作为我自己的练习。我试图要匹配的模式看起来像这样:C#正则表达式,检索用逗号分隔的两个单词,括号运算符

"(SomeWord,OtherWord)" 

阅读一些文件,看着我得出的结论备忘单之后,下面的正则表达式应该给我2场比赛:

"\((\w),(\w)\)" 

由于根据文档括号应执行以下操作:

(模式)与模式匹配和记住匹配。匹配的 子串可以使用Item [0] ... [n]从结果匹配集合 中检索。要匹配括号字符(),请使用“\(”或 “\)”。

但是使用下面的代码(删除错误检查简洁)匹配非常不同的东西:

string line = "(A,B)"; 
string pattern = @"\((\w),(\w)\)"; 
MatchCollection matches = Regex.Matches(line, pattern); 
string left = matches[0].Value; 
string right = matches[1].Value; 

现在我希望留下来成为“A”,并成为“B”的权利。然而,左变成了“(A,B)”,并且根本没有第二次比赛。我在这里错过了什么?

(我知道这个例子很简单没有正则表达式,但要学会如何正确地使用正则表达式我应该可以做一些简单的,因为这解决工作)

回答

2

你想第一场比赛的Groups成员。在你的例子中,只有1个匹配,这是整个字符串。在Groups集合中,您将有3个项目。试试这个示例代码,左边应该是A,右边应该是B.如果你看看group[0]的值,它将是整个字符串。

string line = "(A,B)"; 
string pattern = @"\((\w),(\w)\)"; 
MatchCollection matches = Regex.Matches(line, pattern); 
GroupCollection groups = matches[0].Groups; 
string left = groups[1].Value; 
string right = groups[2].Value; 
+0

嘿pstrjds,这的确做到了,我会接受在几分钟内你的答案!由于文档明确地谈论了匹配项目,所以我没有想到看看组。谢谢你的帮助! –

+3

对。 MatchCollection是针对模式的匹配集合,而不是模式中标识的字符串集合。如果输入是“'(A,B)blah(C,D)'”,则在MatchCollection中会有两个匹配 - 一个用于“(A,B)”,另一个用于“ ,D)'',与'matches [0] .Groups [1] .Value ==“A”','matches [0] .Groups [2] .Value ==“B”','matches [1] .Groups [1] .Value ==“C”',和'matches [1] .Groups [2] .Value ==“C”'。 'Groups [0]'总是包含匹配的整个字符串:'matches [0] .Groups [0] .Value ==“(A,B)”'​​和'matches [1] .Groups [0] .Value ==“(C,D)”'。 –

1

\w比赛只有一个字字符。如果字必须包含至少一个字符,表达应该是:

string pattern = @"\((\w+),(\w+)\)"; 

如果词语可能是空的:

string pattern = @"\((\w*),(\w*)\)"; 

+:用于一个或多个重复。

*:表示零,一次或多次重复。

在任何情况下,您将得到一个包含三个组的匹配,第一个包含整个字符串,包括左括号和右括号,其他两个单词。

0

首先,它是一个 “匹配”,2 “团体” ......

我建议你命名组反正...

string pattern = @"\((?<FirstWord>\w+),(?<SecondWord>\w+)\)"; 

那么你可以做...

Match m = Regex.Match(line, pattern); 

string firstWord = m.Groups["FirstWord"].Value; 
1

我认为问题是,你混淆一个matchgroup的概念。

一个MatchCollection包含匹配整个正则表达式,不只是正则表达式内的括号组字符串列表。例如,如果你搜索的字符串看起来像这样...

(A,B)(C,D) 

...那么你将有两场比赛:(A,B)(C,D)

然而,有个好消息:你可以从每场比赛得到group,希望能非常容易,就像这样:

string line = "(A,B)"; 
string pattern = @"\((\w),(\w)\)"; 
MatchCollection matches = Regex.Matches(line, pattern); 
string left = matches[0].Groups[1].Value; 
string right = matches[0].Groups[2].Value; 

Groups变量是括号组从单一的匹配的集合。

编辑: 奥利维尔Jacot-Descombes取得了很好的一点:我们都得到了这么挂了解释比赛对我们忘了通知第二个问题组:\w将只匹配单个字符。您需要添加一个量词(如+)以便一次抓取多个字符。奥利维尔的回答应该清楚地解释这一部分。

0

由于您正在寻找的是用逗号分隔的字符,因此您可以简单地使用\ w作为您的模式。该比赛将是A和B.

测试您的正则表达式的一个方便网站为http://gskinner.com/RegExr/

相关问题