Up to three delimiters (begin, end, and inner) can be given, and can be returned as part of output
Heavily tested (almost 30 cases)
Overview
The primary motivation for this is CMake syntax analysis (this can be seen in the test cases).
It's incredibly cumbersome to use Regex in a situation like this, especially in languages like CMake which use $ or other reserved characters in Regex. Alternate ways like splitting the string will destroy the syntax and/or just leave you with garbage on top of garbage.
Case Examples and Usage
Full Example: Different Outer Delimiters and Inner Delimiters
Consider the following syntactically correct CMake snippet:
Assume we want to get the OR segment with its associated delimiters. With this function, it is:
let line = "if(lt;lt;OR:lt;CXX_COMPILER_ID:MSVC>,lt;CXX_COMPILER_ID:Clang>>>)";
let result = getStringWithinDelimiters(line, line.indexOf("OR"), "lt;", ">", true, ":");
// result now has "lt;OR:lt;CXX_COMPILER_ID:MSVC>,lt;CXX_COMPILER_ID:Clang>>"
Assume we want only the inner delimiter : with the above result:
let line = "if(lt;lt;OR:lt;CXX_COMPILER_ID:MSVC>,lt;CXX_COMPILER_ID:Clang>>>)";
let result = getStringWithinDelimiters(line, line.indexOf("OR"), "lt;", ">", false, ":", true);
// result now has "OR:lt;CXX_COMPILER_ID:MSVC>,lt;CXX_COMPILER_ID:Clang>"
Simplified Example: Same Outer Delimiter and Optional Inner Delimiter
A simplified function with only one delimiter and optional inner delimiter is also provided.
let line = "std::cout << \"Vector size: \" << v.size() << std::endl();";
let del = "<<";
let result = getStringWithinSurroundDelimiter(line, line.indexOf("size:"), del);
// result now has " \"Vector size: \" "
Assume we want to get the size() function:
let line = "std::cout << \"Vector size: \" << v.size() << std::endl();";
let del = "<<";
let result = getStringWithinSurroundDelimiter(line, line.indexOf(".") + 1, del, ".");
// result now has "size() "
Note that in any of these cases, if the input is invalid or there was nothing found, the return value will always be null.
Contributing
PRs are welcome.
Create a branch against master and have the branch name be descriptive.
Before submitting, ensure that all tests pass and there are no linting errors.