点之间的数字子串

时间:2017-01-24 12:55:59

标签: c# regex

我正在尝试创建一个正则表达式,它找到以点(。)开头的子串,只有数字并以另一个点结束,或者字符串结束。 为了澄清,这里有几个例子:

abc.123.ds => 123
aAsd.12sd.SAs.32.asd.3123 => 32 and 3123
111.2e2 => no result
aaa.bbb.13.320.a => 13 and 320

我尝试了不同的方法,这是我最接近结果的"^[.][0-9]+\.?$",但它仍然失败。 任何提示将不胜感激

3 个答案:

答案 0 :(得分:4)

^[.][0-9]+\.?$失败,因为^强制模式在字符串的开头匹配,$使其匹配字符串的结尾(完整的字符串),.? 1}}最后,当匹配时,将使用.,并且不会让重叠的数字与前面的点匹配。

我建议使用lookarounds:

(?<=\.)[0-9]+(?=\.|$)

请参阅regex demo

<强>详情:

  • (?<=\.) - 当前位置左侧必须有.
  • [0-9]+ - 1+位数
  • (?=\.|$) - 当前位置右侧必须有.或字符串结尾。

C#:

var res = Regex.Matches(str, @"(?<=\.)[0-9]+(?=\.|$)")
      .Cast<Match>()
      .Select(m => m.Value)
      .ToList();

答案 1 :(得分:0)

删除行锚的开头,为另一行做另一种选择:

\.[0-9]+(\.|$)

答案 2 :(得分:0)

使用捕获群组

非常简单
int[] result = Regex.Matches("\.(\d+)\.?").Cast<Match>().Select(x=> int.Parse(x.Groups[2].Value)).ToList();

第一组是你的整场比赛

  

\。(\ d +)\。?

第二个是第一个嵌套大括号 - 闭合表达式

  

\ d +