我有一个正则表达式,旨在从两个括号之间提取一个数字。它一直工作正常,直到我们使输入字符串可自定义。现在,如果在字符串中的其他位置找到一个数字,则会获取最后一个数字。我的表达如下:
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);
不幸的是,对于每个,我得到一个异常,说明输入字符串的格式不正确。我之前没有得到。我确信我可以在一两分钟内不使用正则表达式来解决这个问题,但我的固执已经开始了。
感谢大家的评论。
答案 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)
部分的目的是什么来自你的问题,但是如果你确实需要它,你可以把它留在原处(只需将它附加到任何一个的末尾)上面的版本)