How to extract a substring from the msg object

Published: | by Julian Knight Reading time ~3 min.
๐Ÿ“– Kb | ๐Ÿ“Ž Development | ๐Ÿ”– Node-RED

Node-RED passes a msg object between node instances in a flow. It is common to need to extract a sub-string and there are multiple ways to achieve this. Here are some simeple examples.

The two main methods to use are either a โ€œChangeโ€ node or a โ€œFunctionโ€ node.

The examples below simply extract the first 4 characters of the msg.payload property to illustrate the possibilities.

Change Node Examples ๐Ÿ”—๏ธŽ

This is the simplest and generally the preferred approach unless you need to do a large number of changes to a msg.

Regular Expression Method ๐Ÿ”—๏ธŽ

Extracting a sub-string is easily done using a regular expression which is one of the methods available to a โ€œChange Ruleโ€ in the Change node.

  • Change Rule Type: Change, msg.payload
  • Search For: ^(.{4}).*$
  • Replace With: $1

This regex matches the whole msg.payload string. The () brackets in a regular expression allow the wrapped content specification to be captured to an internal variable which we use in the replace section as $1

[{"id":"4a1695b4.85f22c","type":"inject","z":"20e74d1e.f19692","name":"","topic":"","payload":"21.300000<xml><exec>/tclrega.exe</exec><sessionId></sessionId><httpUserAgent></httpUserAgent><d>BidCos-RF.MEQ0800939:4.ACTUAL_TEMPERATURE</d></xml>","payloadType":"str","repeat":"","crontab":"","once":false,"onceDelay":0.1,"x":270,"y":100,"wires":[["235a041.55c49fc"]]},{"id":"cbbf5f80.6b42a","type":"debug","z":"20e74d1e.f19692","name":"","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"false","x":630,"y":100,"wires":[]},{"id":"235a041.55c49fc","type":"change","z":"20e74d1e.f19692","name":"","rules":[{"t":"change","p":"payload","pt":"msg","from":"^(.{4}).*$","fromt":"re","to":"$1","tot":"str"}],"action":"","property":"","from":"","to":"","reg":false,"x":440,"y":100,"wires":[["cbbf5f80.6b42a"]]}]

JSONata Methods ๐Ÿ”—๏ธŽ

There are several ways to use JSONata to extract a sub-string, here I illustrate a couple

$match (regular expression) ๐Ÿ”—๏ธŽ

  • Change Rule Type: Set, msg.payload
  • To: $match(payload, /^.{4}/)
[{"id":"61aeec2b.95a4f4","type":"change","z":"20e74d1e.f19692","name":"","rules":[{"t":"set","p":"payload","pt":"msg","to":"$match(payload, /^.{4}/)\t","tot":"jsonata"}],"action":"","property":"","from":"","to":"","reg":false,"x":420,"y":160,"wires":[["9e768e8.0e2e67"]]},{"id":"ae3d0976.e0a4a8","type":"inject","z":"20e74d1e.f19692","name":"","topic":"","payload":"21.300000<xml><exec>/tclrega.exe</exec><sessionId></sessionId><httpUserAgent></httpUserAgent><d>BidCos-RF.MEQ0800939:4.ACTUAL_TEMPERATURE</d></xml>","payloadType":"str","repeat":"","crontab":"","once":false,"onceDelay":0.1,"x":270,"y":160,"wires":[["61aeec2b.95a4f4"]]},{"id":"9e768e8.0e2e67","type":"debug","z":"20e74d1e.f19692","name":"","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"false","x":630,"y":160,"wires":[]}]

$substring ๐Ÿ”—๏ธŽ

  • Change Rule Type: Set, msg.payload
  • To: $substring(payload, 0, 4)
[{"id":"f550ddc8.1a56f","type":"change","z":"20e74d1e.f19692","name":"","rules":[{"t":"set","p":"payload","pt":"msg","to":"$substring(payload, 0, 4)\t","tot":"jsonata"}],"action":"","property":"","from":"","to":"","reg":false,"x":420,"y":220,"wires":[["835a813f.698f1"]]},{"id":"1bdcf392.de1a5c","type":"inject","z":"20e74d1e.f19692","name":"","topic":"","payload":"21.300000<xml><exec>/tclrega.exe</exec><sessionId></sessionId><httpUserAgent></httpUserAgent><d>BidCos-RF.MEQ0800939:4.ACTUAL_TEMPERATURE</d></xml>","payloadType":"str","repeat":"","crontab":"","once":false,"onceDelay":0.1,"x":270,"y":220,"wires":[["f550ddc8.1a56f"]]},{"id":"835a813f.698f1","type":"debug","z":"20e74d1e.f19692","name":"","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"false","x":630,"y":220,"wires":[]}]

Function Node Example ๐Ÿ”—๏ธŽ

The Function node allows you to use JavaScript to process the msg object. You may wish to use this method if you are familiar with JavaScript and have a fairly complex processing requirement or an existing set of code.

/***
 * This demonstrates a number of ways to extract
 * a sub-string from the payload.
 *
 * Note that you don't really need an intermediate
 * variable but it does make the code easier to read.
 *
 * Also note that I've used `const` which was
 * introduced to JavaScript in ES2015 (AKA ES6).
 ***/

// slice is the easiest method to extract a sub-string
// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/slice
let newStr = msg.payload.slice(0, 4);

// ---- Other possible methods ---- {

// Regular Expressions: str.match, str.exec or str.replace
// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/match
// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/RegExp/exec
// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/replace

// str.substr - older method than slice
// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/substr
//let newStr = msg.payload.substr(0,4)
// str.substring - older method than slice
// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/substr
//let newStr = msg.payload.substring(0,3)
//
// The arguments of substring() represent the starting and ending indexes, while the arguments of
// substr() represent the starting index and the length of characters to include in the returned string.

// -------------------------------- }

msg.payload = newStr;

return msg;
[{"id":"da10e728.ae30d8","type":"inject","z":"20e74d1e.f19692","name":"","topic":"","payload":"21.300000<xml><exec>/tclrega.exe</exec><sessionId></sessionId><httpUserAgent></httpUserAgent><d>BidCos-RF.MEQ0800939:4.ACTUAL_TEMPERATURE</d></xml>","payloadType":"str","repeat":"","crontab":"","once":false,"onceDelay":0.1,"x":270,"y":280,"wires":[["7b9217ad.a29e58"]]},{"id":"d49e42b1.f141d","type":"debug","z":"20e74d1e.f19692","name":"","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"false","x":630,"y":280,"wires":[]},{"id":"7b9217ad.a29e58","type":"function","z":"20e74d1e.f19692","name":"","func":"/***\n * This demonstrates a number of ways to extract\n * a sub-string from the payload.\n * \n * Note that you don't really need an intermediate\n * variable but it does make the code easier to read.\n * \n * Also note that I've used `const` which was \n * introduced to JavaScript in ES2015 (AKA ES6).\n ***/\n\n// slice is the easiest method to extract a sub-string\n// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/slice\nlet newStr = msg.payload.slice(0, 4);\n\n// ---- Other possible methods ---- {\n\n// Regular Expressions: str.match, str.exec or str.replace\n// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/match\n// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/RegExp/exec\n// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/replace\n\n// str.substr - older method than slice\n// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/substr\n//let newStr = msg.payload.substr(0,4)\n// str.substring - older method than slice\n// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/substr\n//let newStr = msg.payload.substring(0,3)\n//\n// The arguments of substring() represent the starting and ending indexes, while the arguments of \n// substr() represent the starting index and the length of characters to include in the returned string.\n\n// -------------------------------- }\n\nmsg.payload = newStr;\n\nreturn msg;","outputs":1,"noerr":0,"x":390,"y":280,"wires":[["d49e42b1.f141d"]]}]