регулярное выражение для соответствия конечных пробелов, но не строк, которые полностью являются пробелами (отступы заполнителей) - PullRequest
7 голосов
/ 19 апреля 2010

Я пытался создать регулярное выражение ruby, которое соответствует конечным пробелам - но не заполнителям отступов - так что я могу выделить их.

У меня было это /\b[\t ]+$/, и оно работало, пока я не понял, что оно работает только тогда, когда концы строк [a-zA-Z]. :-( Так что я превратил его в /(?!^[\t ]+)[\t ]+$/, и кажется, что он становится лучше, но он все еще не работает должным образом. Я потратил часы, пытаясь заставить это работать безрезультатно. Пожалуйста, помогите.

Вот несколько текстовых тестов, поэтому их легко добавить в Rubular, но строки отступа убираются, поэтому потребуется несколько пробелов и / или табуляции. Если в строках 3 и 4 есть пробелы, они не должны совпадать со строками 3-5, 7, 9.

some test test  
some test test      


  some other test (text)
  some other test (text)  
  likely here{ dfdf }
  likely here{ dfdf }        
  and this ;
  and this ;  

В качестве альтернативы, есть ли более простой / более элегантный способ сделать это?

Ответы [ 5 ]

12 голосов
/ 19 апреля 2010

Если вы используете 1.9, вы можете использовать просмотр:

/(?<=\S)[\t ]+$/

, но, к сожалению, он не поддерживается в более старых версиях ruby, поэтому вам придется обрабатывать захваченный символ:

str.gsub(/(\S)[\t ]+$/) { $1 }
1 голос
/ 19 апреля 2010

Ваше первое выражение близко, и вам просто нужно изменить \ b на класс символов с отрицанием.Это должно работать лучше:

/([^\t ])[\t ]+$

Проще говоря, это соответствует всем символам табуляции и пробелам в строках, которые следуют за символом, который не является символом табуляции или пробела.

0 голосов
/ 19 апреля 2010

возможно это ...

[\ т | \ s]? + $

или [] + $

0 голосов
/ 19 апреля 2010

edit: о, вы имели в виду не пустые строки. Тогда вам понадобится что-то вроде / ([^ \ s]) \ s + / и подставьте их в первую часть

Я не совсем уверен в том, что вы просите, но разве вам не понравится эта работа, если вы просто захотите захватить конечные пробелы?

([\s]+)$

или, если вы хотите захватить только вкладки

([ \t]+)$

Поскольку регулярные выражения являются жадными, они будут захватывать столько, сколько смогут. Вам не нужно заранее давать им контекст, если вы знаете, что хотите захватить.

Я до сих пор не уверен, что вы имеете в виду, заключая в себе заполнители отступов, поэтому извините, если я неправильно понял.

0 голосов
/ 19 апреля 2010

Разве это не поможет?

/([^\t ])([\t ]+)$/

Однако вам нужно что-то сделать с последним непробельным символом

...