Home > Software design >  Find first occurrence of a character in string with regex
Find first occurrence of a character in string with regex

Time:02-04

I want to match the element with "mailReceiverList" with a regular expression:

    {
        "parameterName": "mailTemplate",
        "valueType": "STRING",
        "parameterValue": null,
        "parameterType": "STANDARD"
    },
    {
        "parameterName": "mailReceiverList",
        "valueType": "STRING",
        "parameterValue": "anything",
        "parameterType": "STANDARD"
    },
    {
        "parameterName": "mailMessage",
        "valueType": "STRING",
        "parameterValue": "something",
        "parameterType": "STANDARD"
    }
]

I tried with regextester.com:

/,{"parameterName":"mailReceiverList",(.*)}/

But it matches also "mailMessage" element.

How to find first following occurence of "}"?

CodePudding user response:

Found it on my own:

/,{"parameterName":"mailReceiverList",[^}]*}/

CodePudding user response:

JSON-parsing and locate an element inside the array.

Given your JSON as string (minified with to be compact in one line):

jsonText = "[{"parameterName":"mailTemplate","valueType":"STRING","parameterValue":null,"parameterType":"STANDARD"},{"parameterName":"mailReceiverList","valueType":"STRING","parameterValue":"anything","parameterType":"STANDARD"},{"parameterName":"mailMessage","valueType":"STRING","parameterValue":"something","parameterType":"STANDARD"}]"

Use Convert JSON to String Online to minify to String (with double-quotes escaped).

in Javascript

See JSON.parse()

Example:

const jsonText = "[{\"parameterName\":\"mailTemplate\",\"valueType\":\"STRING\",\"parameterValue\":null,\"parameterType\":\"STANDARD\"},{\"parameterName\":\"mailReceiverList\",\"valueType\":\"STRING\",\"parameterValue\":\"anything\",\"parameterType\":\"STANDARD\"},{\"parameterName\":\"mailMessage\",\"valueType\":\"STRING\",\"parameterValue\":\"something\",\"parameterType\":\"STANDARD\"}]";

let elements =  JSON.parse(jsonText);  // parse JSON-string
console.log("elements size:", elements.length);  // verify all read

// find desired element
let mailReceiverListElement = elements.filter(e => e.parameterName == "mailReceiverList")[0];
console.log("found it:", mailReceiverListElement);

in Java

Use Jackson as in How to parse a JSON string to an array using Jackson:

// the class is needed as object for array-elements
public class Element {

  String parameterName;
  String valueType;
  String parameterValue;
  String parameterType;

  public static void main(String[] args) {
    String jsonText = "[{\"parameterName\":\"mailTemplate\",\"valueType\":\"STRING\",\"parameterValue\":null,\"parameterType\":\"STANDARD\"},{\"parameterName\":\"mailReceiverList\",\"valueType\":\"STRING\",\"parameterValue\":\"anything\",\"parameterType\":\"STANDARD\"},{\"parameterName\":\"mailMessage\",\"valueType\":\"STRING\",\"parameterValue\":\"something\",\"parameterType\":\"STANDARD\"}]";

    // parse JSON-string to Java array of class Element
    ObjectMapper mapper = new ObjectMapper();
    Element[] elements = (Element[]) mapper.readValue(jsonText, new TypeReference<Element[]>(){});
    
    System.out.println(elements.length);  // verify all read
    
    // filter array elements for desired one
    for (Element e : elements) {
      if ("mailReceiverList".equals(e.parameterName)) {
        System.out.println("Found it: "   e.parameterValue);
      }
    }

  }

}

in Python

import json

jsonText = "[{\"parameterName\":\"mailTemplate\",\"valueType\":\"STRING\",\"parameterValue\":null,\"parameterType\":\"STANDARD\"},{\"parameterName\":\"mailReceiverList\",\"valueType\":\"STRING\",\"parameterValue\":\"anything\",\"parameterType\":\"STANDARD\"},{\"parameterName\":\"mailMessage\",\"valueType\":\"STRING\",\"parameterValue\":\"something\",\"parameterType\":\"STANDARD\"}]"

# parse JSON text
elements = json.loads(jsonText)  # as list of dicts

print(len(elements))  # verify all read

# filter list elements for desired one
for e in elements:
    if e['parameterName'] == 'mailReceiverList':
        print('found it:', e)

Prints:

3
('found it:', {u'parameterType': u'STANDARD', u'parameterName': u'mailReceiverList', u'valueType': u'STRING', u'parameterValue': u'anything'})

CodePudding user response:

I would use this regex:

/{"parameterName":"mailReceiverList",[^{]*}/

Without the leading comma, so you are not dependent on the order of the returned array.

  •  Tags:  
  • Related