从括号之间提取数字

时间:2014-05-29 15:51:58

标签: c# regex

我有一个正则表达式,旨在从两个括号之间提取一个数字。它一直工作正常,直到我们使输入字符串可自定义。现在,如果在字符串中的其他位置找到一个数字,则会获取最后一个数字。我的表达如下:

int icorrespid = Convert.ToInt32(Regex.Match(subject, @"(\d+)(?!.#\d)", RegexOptions.RightToLeft).Value);

如果我发送字符串This (12) is a test,它工作正常,解压缩12.然而,如果我发送This (12) is a test2,结果是2.我意识到我可以将RightToLeft更改为LeftToRight,这将修复此实例,但我只想获得括号之间的数字。

我相信对于任何有正规表达经验的人来说这很容易(显然不是我)。我希望你能告诉我如何纠正这个问题以获得我想要的东西,同时也简要解释一下我做错了什么,这样我才能有所改进。

谢谢。

其他信息

我感谢所有回复。我已经采纳了商定的建议,并尝试了以下各种格式:

int icorrespid = Convert.ToInt32(Regex.Match(subject, @"(\(\d+\))(?!.#\d)", RegexOptions.RightToLeft).Value);

int icorrespid = Convert.ToInt32(Regex.Match(subject, @"(\(\d+\))", RegexOptions.RightToLeft).Value);

int icorrespid = Convert.ToInt32(Regex.Match(subject, @"\(\d+\)", RegexOptions.RightToLeft).Value);

不幸的是,对于每个,我得到一个异常,说明输入字符串的格式不正确。我之前没有得到。我确信我可以在一两分钟内不使用正则表达式来解决这个问题,但我的固执已经开始了。

感谢大家的评论。

4 个答案:

答案 0 :(得分:2)

你需要在正则表达式中转义括号,因为它们意味着什么

@"(\(\d+\))(?!.#\d)

或者,如果您实际上并未打算将您的号码捕获到群组中

@"\(\d+\)(?!.#\d)

答案 1 :(得分:1)

试试这个正则表达式:

\(#(\d+)\)

括号被转义\(\),其中正常搜索数字。

如果您使用.Value属性,它会为您提供括号括起来的数字。相反,您需要使用Groups集合。因此,要在代码中使用,请执行以下操作:(现在添加错误检查!)

var match = Regex.Match("hgf", @"\(#(\d+)\)", RegexOptions.RightToLeft).Groups[1].Value;
if(!string.IsNullOrEmpty(match))
{
    var icorrespid = Convert.ToInt32(match);
}
else
{
    //No match found
}

答案 2 :(得分:1)

使用:

\(\d+\)(?!.#\d)

()是保留字符,称为捕获组。

答案 3 :(得分:0)

括号在正则表达式中有意义,所以你需要转义它们:

\(\d+\)

实际意义是创建一个捕获组,所以如果您依赖代码中的捕获组,则需要另外一对括号:

\((\d+)\)

我不太确定(?!.#\d)部分的目的是什么来自你的问题,但是如果你确实需要它,你可以把它留在原处(只需将它附加到任何一个的末尾)上面的版本)