Мне нужно регулярное выражение в javascript, которое не будет выполнено в случаях, когда строка имеет значение:
foo[ bar]
foo[bar ]
foo[ bar ]
foo
может быть любым словом (также может содержать специальные символы как -
и .
), то же самое для bar
.
Он не должен терпеть неудачу, если строка просто:
[ bar]
[bar ]
[ bar ]
И не должен прерываться, если строка:
foo[bar]
Немного информации о предыстории. Я пишу настраиваемое правило linter, которое завершится неудачно, если массив ссылок имеет ненужные пробелы в скобках. Любая помощь приветствуется.
Это то, что у меня есть до сих пор (Regex101):
\[([^\]]+)\]
Но это улавливает весь скотч и не оценивает начало (оно должно предшествовать). Кроме того, он должен оценивать наличие только пробелов.
Кажется, вы только хотите сопоставить строки, которые 1) имеют 1 или более символов слова до (
и 2) имеют пробелы сразу после [
или прямо до ]
.
Вы можете использовать
/\w+\[(\s[^\]]*|[^\]]*\s)]/
См. Демо-версию regex.
подробности
\w+
- 1 или более символов слова\[
- a [
(\s[^\]]*|[^\]]*\s)
- любая из двух альтернатив: \s[^\]]*
- символ пробела, за которым следуют символы 0+, кроме ]
|
- или же[^\]]*\s
- символы 0+ кроме ]
за которым следует символ пробела]
- a ]
char.JS demo:
var rx = /\w+\[(\s[^\]]*|[^\]]*\s)]/;
var strs = [ "foo[ bar]", "foo[bar ]", "foo[ bar ]", "[ bar]", "[bar ]", "[ bar ]"];
for (var s of strs) {
console.log(s, "=>", rx.test(s));
}
Вы можете попробовать /\[\s+[a-zA-Z0-9._]|[a-zA-Z0-9._]\s+\]/g
:
function test(str){
var regex = /\[\s+[a-zA-Z0-9._]|[a-zA-Z0-9._]\s+\]/g;
if(str.match(regex))
return 'Passed';
else
return 'Failed';
}
//Passed
console.log(test('foo[ bar]'));
console.log(test('foo[bar ]'));
console.log(test('foo[ bar ]'));
console.log(test('foo[.bar ]'));
console.log(test('foo[ bar- ]'));
//Failed
console.log(test('foo[bar]'));
foo
может быть любым словом (также может содержать специальные символы как -
и .
), То же самое относится и к bar
.
Немного мирское, но:
var rgx = /^(?:\w|[_\-.])+?\[(?:\w|[_\-.])+\]|^\[\s*(?:\w|[_\-.])+\s*\]/gi;
похоже, работает на ваши случаи:
var rgx = /^(?:\w|[_\-.])+?\[(?:\w|[_\-.])+\]|^\[\s*(?:\w|[_\-.])+\s*\]/i;
["foo[ bar]","foo[bar ]","foo[ bar ]","[ bar]","[bar ]","[ bar ]","foo[bar]"]
.forEach(function(d,i){console.log(rgx.test(d))});
//false x 3
//true x 4
!rgx.test(someString)
.
foo [bar ]
илиfoo [bar]
потерпеть неудачу?