从括号之间抽取一个数字

本文关键字:一个 数字 之间 | 更新日期: 2023-09-27 18:05:59

我有一个正则表达式,用于从两个括号之间提取一个数字。在我们使输入字符串可定制之前,它一直工作得很好。现在,如果在字符串的其他地方找到了一个数字,则取最后一个数字。我的表达式如下:

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

如果我发送字符串This (12) is a test,它工作得很好,提取12。然而,如果我发送This (12) is a test2,结果是2。我意识到我可以将rightolleft更改为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);
不幸的是,对于每一个,我都得到一个异常,说明输入字符串的格式不正确。我以前不明白。我确信我可以在一两分钟内不使用正则表达式解决这个问题,但是我的固执已经开始了。

感谢大家的评论

从括号之间抽取一个数字

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

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

或者,如果你不想让你的号码出现在群里

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

试试这个正则表达式:

'(#('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
}

使用说明:

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

()是被称为捕获组的保留字符

括号在正则表达式中有含义,所以需要转义:

'('d+')

实际的意思是创建一个捕获组,所以如果你在代码中依赖于一个捕获组,你需要另外一对括号,像这样:

'(('d+)')

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