2017-01-06 3 views
1

Я хочу сопоставить конечные пробелы в конце строк, но не если строка целиком сделана из пробелов.Соответствующие пробелы, но не строки пробелов с использованием JavaScript RegExp

Эти пробелы должны быть заменены.

В следующем выражении используется отрицательный lookahead для соответствия этим пробелам, но, похоже, не работает.

/(?!^(| )+$)(| )+$/gm 

Вот входной образец

#The following line's trailing spaces should match 
Foo   

#But not a line full of whitespace 
      

А вот фрагмент

var oRegExp = /(?!^(| )+$)(| )+$/; 
 

 
// Test cases 
 
var test = function (sInput, sOutput) { 
 
    var oMatch = sInput.match(oRegExp); 
 
    var bSuccess = (oMatch === null && sOutput === null) || oMatch[0] === sOutput; 
 
    console.log('"' + sInput + '" ', bSuccess ? 'success' : 'failed'); 
 
}; 
 
test('Foo   ', '   '); 
 
test('   ', null); 
 
test('', null);

Regex101 sample

ответ

2

Используйте regex как /\S\s+$/, который соответствует любому символу без пробелов, за которым следует пробел в конце. Или более конкретно регулярное выражение /[^ ][ ]+$/, который не включает в себя символ новой строки символа, табуляцию и т.д.

Еще несколько советов:

  1. На самом деле, вы даете аргумент как регулярное выражение так RegExp совершенно не нужно здесь.
  2. Глобальный флаг не играет никакой роли в вашем коде, поскольку он встречается только один раз.
  3. Используйте метод RegExp#test для получения логического значения при совпадении строки.

var oRegExp = /\S\s+$/; 
 
// or more specific 
 
// oRegExp = /[^ ][ ]+$/; 
 

 
var sValidInput = 'Foo '; 
 
var sInvalidInput = ' '; 
 

 
console.log('"' + sValidInput + '" should match: ', oRegExp.test(sValidInput)); 
 
console.log('"' + sInvalidInput + '" should not match: ', oRegExp.test(sInvalidInput));


UPDATE: Использование регулярных выражений /^(?!(?: | )+$).*?(| )+$/ который используется negative look-ahead assertion, чтобы соответствовать любой другой комбинации.

var oRegExp = /^(?!(?: | )+$).*?(| )+$/; 
 

 
var sValidInput = 'Foo   '; 
 
var sInvalidInput = '   '; 
 

 

 
console.log('"' + sValidInput + '" should match: ', oRegExp.test(sValidInput)); 
 
console.log('"' + sInvalidInput + '" should not match: ', oRegExp.test(sInvalidInput));

+0

Спасибо за ответ! На самом деле, мой usecase немного сложнее, и я думаю, что \ s не будет делать, я отредактирую вопрос – Vinky

+0

См. Мой отредактированный вопрос, что касается того, почему я собирался использовать негативный вариант обзора. Любая идея, почему это не работает так, как я себе представлял? – Vinky

+0

@ Vinky: проверьте обновление –

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