我有一串字符,其中包含0个或更多ABC = dddd
个字符。 dddd
代表整数值,不一定是四位数。
我想要做的是捕获此模式中出现的整数值。我知道如何与正则表达式进行匹配,但我不熟悉捕获。没有必要在一次调用中捕获所有ABC整数值 - 它可以循环遍历字符串。
如果这太复杂了,我只会写一个小解析器,但如果它相当优雅我想使用正则表达式。专业知识非常感谢。
答案 0 :(得分:3)
首先,我们需要从与我们正在寻找的模式匹配的正则表达式开始。这将匹配您给出的示例(假设ABC是字母数字):\w+\s*=\s*\d+
接下来,我们需要通过定义捕获组来定义我们想要在匹配中捕获的内容。 .Net包括对命名捕获组的支持,我非常喜欢。我们使用(?<name for capture>expression)
指定一个组,将我们的正则表达式转换为:(?<key>\w+)\s*=\s*(?<value>\d+)
。这给了我们两个捕获,关键和价值。
使用此功能,我们可以迭代文本中的所有匹配项:
Regex pattern = new Regex(@"(?<key>\w+)\s*=\s*(?<value>\d+)");
string body = "This is your text here. value = 1234";
foreach (Match match in pattern.Matches(body))
{
Console.WriteLine("Found key {0} with value {1}",
match.Groups.Item["key"].Value,
match.Groups.Item["value"].Value
);
}
答案 1 :(得分:1)
您可以使用以下内容:
MatchCollection allMatchResults = null;
try {
// This matches a literal '=' and then any number of digits following
Regex regexObj = new Regex(@"=(\d+)");
allMatchResults = regexObj.Matches(subjectString);
if (allMatchResults.Count > 0) {
// Access individual matches using allMatchResults.Item[]
} else {
// Match attempt failed
}
} catch (ArgumentException ex) {
// Syntax error in the regular expression
}
根据你的情节,也许这就是你所追求的更多:
try {
Regex regexObj = new Regex(@"=(\d+)");
Match matchResults = regexObj.Match(subjectString);
while (matchResults.Success) {
for (int i = 1; i < matchResults.Groups.Count; i++) {
Group groupObj = matchResults.Groups[i];
if (groupObj.Success) {
// matched text: groupObj.Value
// match start: groupObj.Index
// match length: groupObj.Length
}
}
matchResults = matchResults.NextMatch();
}
} catch (ArgumentException ex) {
// Syntax error in the regular expression
}