Как сопоставить контент с регулярным выражением

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

В IE8 работает 100%. Протестировано успешно.

//  ObjectKey: ["DataType, DefaultValue"]
reference = { 
    a : ["string", 'Defaul value for "a"'],
    b : ["number", 300],
    c : ["boolean", true],
    d : {
        da : ["boolean", true],
        db : ["string", 'Defaul value for "db"'],
        dc : {
            dca : ["number", 200],
            dcb : ["string", 'Default value for "dcb"'],
            dcc : ["number", 500],
            dcd : ["boolean", true]
      },
      dce : ["string", 'Default value for "dce"'],
    },
    e : ["number", 200],
    f : ["boolean", 0],
    g : ["", 'This is an internal extra parameter']
};

userOptions = { 
    a : 999, //Only string allowed
  //b : ["number", 400], //User missed this parameter
    c: "Hi", //Only lower case or case insitive in quotes true/false allowed.
    d : {
        da : false,
        db : "HelloWorld",
        dc : {
            dca : 10,
            dcb : "My String", //Space is not allowed for ID attr
            dcc: "3thString", //Should not start with numbers
            dcd : false
      },
      dce: "ANOTHER STRING",
    },
    e: 40,
    f: true,
};


function compare(ref, obj) {

    var validation = {
        number: function (defaultValue, userValue) {
          if(/^[0-9]+$/.test(userValue))
            return userValue;
          else return defaultValue;
        },
        string: function (defaultValue, userValue) {
          if(/^[a-z][a-z0-9-_.:]{1,51}[^-_.:]$/i.test(userValue)) //This Regex is validating HTML tag "ID" attributes
            return userValue;
          else return defaultValue;
        },
        boolean: function (defaultValue, userValue) {
          if (typeof userValue === 'boolean')
            return userValue;
          else return defaultValue;
        }
    };

    for (var key in ref)
        if (obj[key] && obj[key].constructor && obj[key].constructor === Object)
          ref[key] = compare(ref[key], obj[key]);
        else if(obj.hasOwnProperty(key))
          ref[key] = validation[ref[key][0]](ref[key][1], obj[key]); //or without validation on user enties => ref[key] = obj[key]
        else ref[key] = ref[key][1];
    return ref;
}

//console.log(
    alert(JSON.stringify( compare(reference, userOptions),null,2 ))
//);

/ * result

{
  "a": "Defaul value for \"a\"",
  "b": 300,
  "c": true,
  "d": {
    "da": false,
    "db": "Defaul value for \"db\"",
    "dc": {
      "dca": 10,
      "dcb": "Default value for \"dcb\"",
      "dcc": 500,
      "dcd": false
    },
    "dce": "Default value for \"dce\""
  },
  "e": 40,
  "f": true,
  "g": "This is an internal extra parameter"
}

*/
0
задан Ajay Suwalka 18 January 2019 в 06:52
поделиться

2 ответа

Вы можете попробовать:

it\([^\[]+?\[8032\]['\"]

Как показано здесь: https://regex101.com/r/G95JCw/1/

[ 115] Пояснение -

[^\[]+ говорит регулярному выражению, что он соответствует всем символам , кроме '[' , пока не достигнет желаемого [8032] - что решает вашу проблему с предыдущим текстом, также выбранным .
['\"] в конце просто выбрать последние кавычки перед асинхронным. Эта часть не нужна, но она немного облегчает извлечение:)

0
ответ дан Robo Mop 18 January 2019 в 06:52
поделиться

Вы должны иметь отрицательный взгляд вперед (?!it) с (.|\n)+?, поэтому он отклоняет большее совпадение, содержащее текст it, и, следовательно, вам нужно использовать это регулярное выражение,

it\((((?!it\(')(.|\n))+?)\[8032\]

Здесь, в Ваше собственное регулярное выражение, единственное добавление, которое я сделал, это (?!it), который гарантирует, что выбранная строка не содержит it внутри нее.

Демонстрация

0
ответ дан Pushpesh Kumar Rajwanshi 18 January 2019 в 06:52
поделиться
Другие вопросы по тегам:

Похожие вопросы: