У нас есть текстовый ввод, где пользователь может ввести некоторый текст и применить некоторые функции поверх текста, например (substr, replace) и т. д. Например, пользователь может ввести текст «привет» в текстовый ввод и применить функцию подстроки ( #substr (hello, 'startIndex', 'length')) и может указать начальный индекс, длину и т. д.

Необходимо использовать регулярное выражение для извлечения значений, переданных в функцию #substr для проверки обязательных полей. Например, «начальный индекс» и «длина» требуются, когда пользователь выбирает функцию substr.

Ниже представлены различные сценарии и ожидаемый результат.

#substr (привет, 1,3) ---> ['привет', '1', '3']

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

#substr (#trim (привет), 1,3) ----> ['#trim (привет)', '1', '3']

#substr (#replace (привет-мир, привет, привет), 1,3) ---> ['#replace (привет-мир, привет, привет)', '1', '3']

Как показано в приведенных выше примерах, необходимо извлечь аргументы, переданные в функцию #substr, как элементы массива.

Пробовал это регулярное выражение

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

Это не удается, когда у нас есть такие вложенные функции, как эта - #substr (#replace (hello-world, hello, hi), 1,3)

1
Shyam 3 Фев 2021 в 21:34

3 ответа

Лучший ответ

Вы можете использовать приведенное ниже регулярное выражение с группами захвата.

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

Для вложенного соответствия это возможно, но очень сложно в регулярном выражении. Простой подход - избегать регулярных выражений и использовать js-код для вложенного сопоставления.

1
Mohan Kumar 4 Фев 2021 в 05:16

Это регулярное выражение может решить ваши проблемы, если строка занимает всю строку, но если вы введете команды через запятую во втором аргументе, это не удастся, это очень сложная проблема, которую можно решить с помощью простого регулярного выражения. Я думаю, вы стучитесь в дверь компилятора.

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

text = "#substr(#replace(hello-world,hello,hi),1,3)";
console.log(regex.exec(text));
0
Andre Marasca 4 Фев 2021 в 00:22

Если вы пытаетесь получить длину пользовательского ввода или индекса, вы можете поместить все нужные методы внутри функции или нескольких функций, которые вызываются при нажатии кнопки.

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

Возможно, я ошибаюсь, но если я возьму один из ваших примеров:

#substr (привет, 1,3) ---> ['привет', '1', '3']

Когда я бегу

str = "hello world"
str.substring(1,3) --> I get "el" (not "hello", "1", "3")
  1. Получите текст:

    var firstName = document.getElementById("firstName").value;  
    var age = document.getElementById("age").value;  
    
  2. Нажмите кнопку, чтобы вызвать вашу функцию.

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

ИЛИ
Убедитесь, что длина соответствует вашим критериям.

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

Или выполнять другие задачи, определяемые аргументом «режим»

else if subString_mode == "integer_test"{  
    if (isNaN(textValue) || age < 12 || age > 100){alert("The age must be between numbers 12 and 100")};
0
cigien 4 Фев 2021 в 05:51
66033647