I am trying to validate text area. Format should be us following:
Text description: ${VARIABLE_NAME} \n
Text description: ${VARIABLE_NAME}
Rules:
- Text description can contain a-zA-Z0-9 spaces and "_"
- Text description need to be followed ":"
- ":" can be followed with no or one space
- after ": " string need to start with "${"
- "VARIABLE_NAME" can contain only A-Z and "_"
- "VARIABLE_NAME" and line need to finish with "}"
Text can have multiple lines, every line need to follow all 6 rules.
For now i have this regex const regex = new RegExp('[\\w ]:\\$\\{[A-Z] }$', 'gs');
Just not sure how to handle multiple lines.
CodePudding user response:
The requirements can be matched as follows:
- →
[\w ]
2. → : 3. → ? 4. → \$\{ 5. → [A-Z_] 6. → }
Put into a (?:
non capturing group (?:\n|$))
for one or more lines.
^(?:[\w ] : ?\$\{[A-Z_] }(?:\n|$)) $
See this demo at regex101 or a JS demo at tio.run (use \r?\n
for CRLF support)
CodePudding user response:
You can use
/^[\w ] :[^\S\r\n]?\${[A-Z_] }(?:\r?\n[\w ] :[^\S\r\n]?\${[A-Z_] })*$/
See the regex demo. Details:
^
- start of string[\w ]
- one or more alphanumeric/underscore/space chars:
- a colon[^\S\r\n]?
- an optional horizontal whitespace\${
- a${
string[A-Z_]
- one or more uppercase ASCII letters or underscores}
- a}
char(?:\r?\n[\w ] :[^\S\r\n]?\${[A-Z_] })*
- zero or more repetitions of the CRLF or LF line ending sequence followed with the above explained pattern$
- end of string.
CodePudding user response:
You may be looking for the m
multiline flag:
const text = "Foo: ${A_1}\nBar Baz: ${B_12}";
const rx = /^[a-zA-Z0-9_ ] : ?\$\{[A-Z0-9_] \}$/gm;
// ^^ global multiline flags
console.table(text.match(rx));
<script src="https://gh-canon.github.io/stack-snippet-console/console.min.js"></script><script>console.config({maximize:true,timeStamps:false})</script><style>.as-console-wrapper{display:block;}</style>