如何在两个特定字符串之间找到数字?

时间:2017-06-02 13:18:56

标签: c# regex

我有以下字符串:

{
   "_matrix":[
      {
         "__FRAMEWORK_ANY_SPEC__":"namesdeleted.mumbojumbo`1[[System.Double, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]]",
         "value":0
      },
      {
         "__FRAMEWORK_ANY_SPEC__":"namesdeleted.mumbojumbo`1[[System.Double, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]]",
         "value":1
      },
      {
         "__FRAMEWORK_ANY_SPEC__":"namesdeleted.mumbojumbo`1[[System.Double, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]]",
         "value":0
      },
      {
         "__FRAMEWORK_ANY_SPEC__":"namesdeleted.mumbojumbo`1[[System.Double, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]]",
         "value":-1
      },
      {
         "__FRAMEWORK_ANY_SPEC__":"namesdeleted.mumbojumbo`1[[System.Double, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]]",
         "value":-.1
      },
      {
         "__FRAMEWORK_ANY_SPEC__":"namesdeleted.mumbojumbo`1[[System.Double, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]]",
         "value":1.1
      },
      {
         "__FRAMEWORK_ANY_SPEC__":"namesdeleted.mumbojumbo`1[[System.Double, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]]",
         "value":0
      },
      {
         "__FRAMEWORK_ANY_SPEC__":"namesdeleted.mumbojumbo`1[[System.Double, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]]",
         "value":0
      },
      {
         "__FRAMEWORK_ANY_SPEC__":"namesdeleted.mumbojumbo`1[[System.Double, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]]",
         "value":.1
      },
      {
         "__FRAMEWORK_ANY_SPEC__":"namesdeleted.mumbojumbo`1[[System.Double, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]]",
         "value":0
      },
      {
         "__FRAMEWORK_ANY_SPEC__":"namesdeleted.mumbojumbo`1[[System.Double, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]]",
         "value":1
      },
      {
         "__FRAMEWORK_ANY_SPEC__":"namesdeleted.mumbojumbo`1[[System.Double, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]]",
         "value":0
      },
      {
         "__FRAMEWORK_ANY_SPEC__":"namesdeleted.mumbojumbo`1[[System.Double, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]]",
         "value":0
      },
      {
         "__FRAMEWORK_ANY_SPEC__":"namesdeleted.mumbojumbo`1[[System.Double, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]]",
         "value":0
      },
      {
         "__FRAMEWORK_ANY_SPEC__":"namesdeleted.mumbojumbo`1[[System.Double, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]]",
         "value":0
      },
      {
         "__FRAMEWORK_ANY_SPEC__":"namesdeleted.mumbojumbo`1[[System.Double, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]]",
         "value":1
      }
   ]
}

我的主要内容我需要收集"value":之后和下一个}之间的所有数字。该值可以是任何十进制/整数。

我个人也希望它能够使用科学记数法,如果可能的话

我现在的正则表达式是:

(?<=("value": ))(?:\d*.)?\d+(?=})

我在C#中使用它,因此?<=有效。

我目前的正则表达式能够过滤以下类型的数字:

  • 1
  • -1
  • 1.1
  • 0.1

我还需要它以适应:

  • - 1

  • 科学记数法,所以如果有办法捕捉"value":和下一个}之间的所有内容

2 个答案:

答案 0 :(得分:2)

我相信这会解决问题: -

/(?s)(?<="value":)(.+?)(?=})/g(使用内联修饰符)

例如:https://regex101.com/r/drNrDS/2

enter image description here

答案 1 :(得分:1)

正如评论中所表达的,这看起来像JSON,你应该解析它而不是试图使用正则表达式。但如果你必须使用正则表达式,这样的东西似乎有用:

(?<=("value": ))(?:-?\d*\.?)?\d+(?=})

更改是添加-?以涵盖可选的减号,并更改.我认为应该将小数与\.匹配,因为.匹配< em>正则表达式中的任何字符,因此需要进行转义。然后我添加了?以使其成为可选项。

https://regex101.com/r/drNrDS/1

如果您想支持1.1e101.1e-3等号码,那么您只需添加一些可选匹配项:

(?<=("value": ))(?:-?\d*\.?)?\d+(?:e|e-)?\d*(?=})

因此,我们添加了与(?:e|e-)?\d*e匹配的e-,后跟一些数字。