从括号之间抽取一个数字
本文关键字:一个 数字 之间 | 更新日期: 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)
部分的目的是来自你的问题,但如果你确实需要它,你可以把它留在那里(只是把它附加到上面任何一个版本的末尾)