// include the latest version of the regex crate in your Cargo.toml
extern crate regex;
use regex::Regex;
fn main() {
let regex = Regex::new(r#"(?x)(,\s*(*SKIP))?+
# Attempts to match a comma and advanced whitespaces,
# without backtracking;
# And if the comma is matched, use (*SKIP) verb,
# which advances the pointer if we fail to match the comma.
# Key - Value pairs not worthy of keeping.
(
"(?!jobID"|exec)[^"]+" # Check if we like this key.
\s*+:\s*+ # The colon, advance whitespaces.
( # Check keys recursively.
"[^"]*"
# String literals, boring.
| {(?2)?+(?>,\s*(?2))*}
# Or: An object storing some key-value pairs
# we don't care about.
| \[(?3)?+(?>,\s*(?3))*\]
# Or: An array storing some values
# we don't care about.
)
)
(?(1)|,?)
# Balance the comma (so the result string is still valid JSON)"#).unwrap();
let string = " \"2597401\":[{\"jobID\":\"2597401\",
\"account\":\"TG-CCR120014\",
\"user\":\"charngda\",
\"pkgT\":{\"pgi/7.2- 5\":{\"libA\":[\"libpgc.so\"],
\"flavor\":[\"default\"]}},
\"startEpoch\":\"1338497979\",
\"runTime\":\"1022\",
\"execType\":\"user:binary\",
\"exec\":\"ft.D.64\",
\"numNodes\":\"4\",
\"sha1\":\"5a79879235aa31b6a46e73b43879428e2a175db5\",
\"execEpoch\":1336766742,
\"execModify\":\"Fri May 11 15:05:42 2012\",
\"startTime\":\"Thu May 31 15:59:39 2012\",
\"numCores\":\"64\",
\"sizeT\":{\"bss\":\"1881400168\",\"text\":\"239574\",\"data\":\"22504\"}},
{\"jobID\":\"2597401\",
\"account\":\"TG-CCR120014\",
\"user\":\"charngda\",
\"pkgT\":{\"pgi/7.2-5\":{\"libA\":[\"libpgc.so\"],
\"flavor\":[\"default\"]}},
\"startEpoch\":\"1338497946\",
\"runTime\":\"33\" \"execType\":\"user:binary\",
\"exec\":\"cg.C.64\",
\"numNodes\":\"4\",
\"sha1\":\"caf415e011e28b7e4e5b050fb61cbf71a62a9789\",
\"execEpoch\":1336766735,
\"execModify\":\"Fri May 11 15:05:35 2012\",
\"startTime\":\"Thu May 31 15:59:06 2012\",
\"numCores\":\"64\",
\"sizeT\":{\"bss\":\"29630984\",\"text\":\"225749\",\"data\":\"20360\"}},
{\"jobID\":\"2597401\",
\"account\":\"TG-CCR120014\",
\"user\":\"charngda\",
\"pkgT\":{\"pgi/7.2-5\": {\"libA\":[\"libpgc.so\"],
\"flavor\":[\"default\"]}},
\"startEpoch\":\"1338500447\",
\"runTime\":\"145\",
\"execType\":\"user:binary\",
\"exec\":\"mg.D.64\",
\"numNodes\":\"4\",
\"sha1\":\"173de32e1514ad097b1c051ec49c4eb240f2001f\",
\"execEpoch\":1336766756,
\"execModify\":\"Fri May 11 15:05:56 2012\",
\"startTime\":\"Thu May 31 16:40:47 2012\",
\"numCores\":\"64\",
\"sizeT\":{\"bss\":\"456954120\",\"text\":\"426186\",\"data\":\"22184\"}},{\"jobID\":\"2597401\",
\"account\":\"TG-CCR120014\",
\"user\":\"charngda\",
\"pkgT\":{\"pgi/7.2-5\":{\"libA\":[\"libpgc.so\"],
\"flavor\":[\"default\"]}},
\"startEpoch\":\"1338499002\",
\"runTime\":\"1444\",
\"execType\":\"user:binary\",
\"exec\":\"lu.D.64\",
\"numNodes\":\"4\",
\"sha1\":\"c6dc16d25c2f23d2a3321d4feed16ab7e10c2cc1\",
\"execEpoch\":1336766748,
\"execModify\":\"Fri May 11 15:05:48 2012\",
\"startTime\":\"Thu May 31 16:16:42 2012\",
\"numCores\":\"64\",
\"sizeT\":{\"bss\":\"199850984\",\"text\":\"474218\",\"data\":\"27064\"}}],";
// result will be an iterator over tuples containing the start and end indices for each match in the string
let result = regex.captures_iter(string);
for mat in result {
println!("{:?}", mat);
}
}
Please keep in mind that these code samples are automatically generated and are not guaranteed to work. If you find any syntax errors, feel free to submit a bug report. For a full regex reference for Rust, please visit: https://docs.rs/regex/latest/regex/