Регулярное выражение для определения начальных и конечных пробелов в квадратных скобках

1

Мне нужно регулярное выражение в javascript, которое не будет выполнено в случаях, когда строка имеет значение:

foo[ bar]
foo[bar ]
foo[ bar ]

foo может быть любым словом (также может содержать специальные символы как - и .), то же самое для bar.

Он не должен терпеть неудачу, если строка просто:

[ bar]
[bar ]
[ bar ]

И не должен прерываться, если строка:

foo[bar]

Немного информации о предыстории. Я пишу настраиваемое правило linter, которое завершится неудачно, если массив ссылок имеет ненужные пробелы в скобках. Любая помощь приветствуется.

Это то, что у меня есть до сих пор (Regex101):

\[([^\]]+)\]

Но это улавливает весь скотч и не оценивает начало (оно должно предшествовать). Кроме того, он должен оценивать наличие только пробелов.

  • 0
    @Xufox Я обновил вопрос.
  • 0
    Должен ли foo [bar ] или foo [bar] потерпеть неудачу?
Показать ещё 4 комментария
Теги:

3 ответа

1
Лучший ответ

Кажется, вы только хотите сопоставить строки, которые 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));
}
1

Вы можете попробовать /\[\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]'));
  • 0
    Это не будет работать в общем случае, так как foo может быть любым словом (также может содержать специальные символы как - и . ), То же самое относится и к bar .
  • 0
    @ WiktorStribiżew, я обновил ответ с помощью этого специального символа в регулярном выражении ...... спасибо
1

Немного мирское, но:

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
  • 0
    Хороший подход, какой должен быть противоположный матч? Таким образом, ложная правда будет полностью изменена. Смотрите: regex101.com/r/d6m07Z/1
  • 0
    Это зависит от того, что вы подразумеваете под противоположным. Что-то вроде "foo [bar]"? Или любая строка, которая не в RGX? Для последнего, я думаю, достаточно !rgx.test(someString) .
Показать ещё 4 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню