BikerDude
BikerDude

Reputation: 444

How to find a number between two particular strings?

I have the following as a string:

{
   "_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
      }
   ]
}

My main I need to collect all the numbers after "value": and between the next } The value can be any decimal/integer number.

I would personally also like it to work with scientific notation if possible.

My current regex is :

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

I'm using it in C#, so ?<= is valid.

My current regex is able to filter the following types of numbers:

I need it to also accommodate for:

Upvotes: 0

Views: 82

Answers (2)

Matt Burland
Matt Burland

Reputation: 45135

As expressed in the comments, this looks like JSON and you ought to parse it rather than try to use regex. But if you must use regex, something like this seems to work:

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

The changes are to add -? to cover the optional minus sign and changing your . which I assume was supposed to match the decimal to \. because . matches any character in regex, so it needs to be escaped. Then I added the ? to make it optional.

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

If you wanted to support number like 1.1e10 and 1.1e-3, then you just need to add a few more optional matches:

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

So we've added (?:e|e-)?\d* which matches e or e- followed by some digits.

Upvotes: 1

DNKROZ
DNKROZ

Reputation: 2852

I believe this will do the trick:-

/(?s)(?<="value":)(.+?)(?=})/g (Using inline modifier)

For example: https://regex101.com/r/drNrDS/2

enter image description here

Upvotes: 3

Related Questions