2016-12-19 5 views
1

Если у меня есть строка, какПользовательские выражения Validate с помощью Regex

${employee} and ${} should be validate 

И я хочу, чтобы извлечь все подстроку, которая содержит шаблон, как

${}

и проверить, как если строка, начиная с $ {и} должны иметь значение?

пусть для ниже строки

${employee} and ${} should be validate 

он должен возвращать массив с двумя элементом

[$ {сотрудника}, $ {}]

и на Validate он должен показать второй элемент, как (не заполнено)

для этого, я пробовал следующий код

function fetchMatches(theString, theRegex){ 
    return theString.match(theRegex).map(function(el) { 
     var index = theString.indexOf(el); 
     return [index, index + el.length - 1]; 
    }); 
} 
fetchMatches(" ${employee} and ${} should be validate",/(\$)(\{)(.*)(\})/i); 

, но он не возвращает желаемый результат.

ребята, пожалуйста, предложите помощь

+0

Это не совсем понятно. Если вам нужно соответствовать только непустым '$ {xxx}', вы можете просто использовать '/ \ $ {[^}] +}/g' regex. Затем вы можете просто проверить строку с помощью 'indexOf ('$ {}') '. –

+0

Я хочу, чтобы все подстроки, начинающиеся с ** $ {** и заканчивающиеся на **} ** и на основе вывода, я хочу проверить, является ли какая-либо подстрока пустой или нет –

+0

Извините, до сих пор неясно, какой точный результат вы хотите получить. –

ответ

0

Вы можете использовать следующее решение: используйте /\${[^{}]*}/g regex с String#match, чтобы получить все совпадения, а затем проведите по совпадениям, чтобы проверить, у которых есть пустое значение:

var s = "${user.lastName}${user.firstName}${}"; 
 
var m, results = []; 
 
var re = /\${[^{}]*}/g; 
 
while ((m=re.exec(s)) !== null) { 
 
    if (m[0] === "${}") { 
 
    console.log("Variable at Index",m.index,"is empty."); 
 
    } else { 
 
    results.push(m[0]); 
 
    } 
 
} 
 
console.log(results);

Поскольку вы упомянули, что могут быть вложенными значения, которые вы можете использовать XRegExp:

var s = "${user.${}lastName}${user.firstName}${}"; 
 
var res = XRegExp.matchRecursive(s, '\\${', '}', 'g', { 
 
    valueNames: [null, null, 'match', null] 
 
}); 
 
for (var i=0; i<res.length; i++) { 
 
    if (~res[i]["value"].indexOf("${}") || res[i]["value"] == "") { 
 
    console.log("The",res[i]["value"],"at Index",res[i]["start"],"is invalid."); 
 
    } else { 
 
    console.log("The",res[i]["value"],"at Index",res[i]["start"],"is valid."); 
 
    } 
 
}
<script src="http://cdnjs.cloudflare.com/ajax/libs/xregexp/3.1.1/xregexp-all.min.js"></script>

+0

Спасибо за ваше обновление. Он отлично работает только для позиции индекса, это должно быть позиция для строки. –

+0

Проверьте обновление. –

+0

также для строки типа $ {user. $ {} LastName} $ {user.firstName} $ {} –

1

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

/(\$)(\{)(.*)(\})/ 

в

/(\$)(\{)[^\}]+(\})/ 
+0

Он работает, но возвращает только первый матч –

1

Попробуйте это:

\$\{(\w+)?\} 

(\w+)? Wi рассмотрим шаблон, есть ли символ внутри $ {} или нет.

+0

Он работает, но возвращает только первое совпадение –

+0

Если вы меняете '/ i' на'/g', я думаю, он даст вам оба матча , –

 Смежные вопросы

  • Нет связанных вопросов^_^