Shyam
Shyam

Reputation: 5497

Regex to extract arguments passed into string '#substr( , , )'

we have a text input where the user can enter some text and apply some functions on top of the text like ( substr , replace ) etc. For example user can enter the text "hello" in the text input and can apply the substring function ( #substr(hello, 'startIndex', 'length'))and can mention the start index and the length etc.

Need to use the regex to extract the values passed into the #substr function for validating the mandatory fields. For example 'start index' and 'length' is required when the user selects the substr function.

Below are the different scenarios and its expected output .

#substr(hello,1,3) ---> ['hello','1','3']

#substr($(sometext),1,3) ---> ['$(sometext)','1','3']

#substr(#trim(hello),1,3) ----> ['#trim(hello)','1','3']

#substr(#replace(hello-world,hello,hi),1,3) ---> ['#replace(hello-world,hello,hi)','1','3']

As from the above examples need to extract the arguments passed into the #substr function as array elements.

Tried this regex

/#substr\((.*?),(.*?),(.*?)\)/g

This fails when we have a nested functions like this - #substr(#replace(hello-world,hello,hi),1,3)

Upvotes: 1

Views: 296

Answers (3)

gadgetGuy
gadgetGuy

Reputation: 45

If you're trying to get the length of user input or index, you could put all the desired methods inside a function or multiple functions that call be called on button-click.

https://www.bitdegree.org/learn/javascript-input

I may be misunderstanding but if I take one of your examples:

#substr(hello,1,3) ---> ['hello','1','3']

When I run

str = "hello world"
str.substring(1,3) --> I get "el" (not "hello", "1", "3")
  1. Get some text:

    var firstName = document.getElementById("firstName").value;  
    var age = document.getElementById("age").value;  
    
  2. Click a button to call your function.

    function doSubstringStuff(textValue, subString_mode) {
      if subString_mode == "length" {  
      return textValue.length;  
    }
    

OR
Validate the length matches your criteria.

if (textValue.length > 10) {
  alert("The name must have no more than 10 characters");

Or Perform other tasks, determined by the argument "mode"

else if subString_mode == "integer_test"{  
    if (isNaN(textValue) || age < 12 || age > 100){alert("The age must be between numbers 12 and 100")};

Upvotes: 0

Mohan Kumar
Mohan Kumar

Reputation: 631

You could use the below regex with capturing groups.

#(\S+?)\((.*)\,(\d+),(\d+)\)

For nested matching, it is not impossible, but much complex in regex. The easy approach should be avoiding regex and using js code for nested matching.

Upvotes: 1

Andre Marasca
Andre Marasca

Reputation: 270

This regex can solve your problems, if the string takes up an entire line, but if you enter comma commands in the second argument, it will fail, this is a very complex problem to solve with simple regex. I think you're knocking on the compilers' door.

regex = /^#substr\((.*),(.*),(.*)\)$/;

text = "#substr(#replace(hello-world,hello,hi),1,3)";
console.log(regex.exec(text));

Upvotes: 0

Related Questions