Выберите строку в регулярном выражении с рубином

Мне нужно очистить строку, переданную в параметре, и удалить все строчные буквы и все специальные символы, кроме:

  • +
  • |
  • ^
  • Космос
  • =>
  • <=>

поэтому я передал эту строку в параметре:

aA azee + B => C=

и мне нужно очистить эту строку, чтобы получить этот результат:

A + B => C

I do

string.gsub(/[^[:upper:][+|^ ]]/, "")

вывод: "A + B C"

Я не знаю, как выбрать строку => (и для <=>) с регулярным выражением в ruby)

Я знаю, что если я добавлю string.gsub(/[^[:upper:][+|^ =>]]/, "") в свое регулярное выражение, последний = в моей строке, переданной в параметре, также будет выбран


person Vincent Cheloudiakoff    schedule 09.04.2018    source источник
comment
(<?=>)|[^[:upper:]+|^ ] заменить на $1?   -  person ctwheels    schedule 09.04.2018
comment
Почему ваша строка содержит эти дополнительные символы?   -  person Stefan    schedule 09.04.2018


Ответы (3)


Вы можете попробовать альтернативный подход: сопоставить все, что вы хотите сохранить, а затем объединить результат.

Вы можете использовать это регулярное выражение, чтобы сопоставить все, что вы хотите сохранить:

[A-Z\d+| ^]|<?=>

Как видите, это просто использование | и [] для создания списка строк, которые вы хотите сохранить: верхний регистр, цифры, +, |, пробел, ^, => и ‹=>.

Пример:

"aA azee + B => C=".scan(/[A-Z\d+| ^]|<?=>/).join()

Выход:

"A  + B => C"

Обратите внимание, что между «А» и «+» есть 2 последовательных пробела. Если вы этого не хотите, вы можете вызвать String#squeeze.

person Sweeper    schedule 09.04.2018
comment
join не требует явной передачи аргумента по умолчанию, и сжатие, вероятно, впоследствии имело бы смысл. - person Aleksei Matiushkin; 09.04.2018
comment
это, тем не менее, лучший подход AFAICT. - person Aleksei Matiushkin; 09.04.2018
comment
Спасибо, я думаю, что это лучший подход к решению моей проблемы! - person Vincent Cheloudiakoff; 09.04.2018
comment
Я думаю, что регулярное выражение также должно включать \d. - person Cary Swoveland; 09.04.2018
comment
/[A-Z\d+| ^]|<?=>/ быстрее, а также включает в себя символ ^, который вы забыли :) - person ctwheels; 09.04.2018

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

(<?=>)|[^[:upper:]+|^ ]
  • (<?=>) Захватывает <=> или => в группу захвата 1
  • [^[:upper:]+|^ ] Соответствует любому символу, который не является заглавной буквой (так же, как [A-Z]) или +, |, ^ или пробелом

см. код здесь

p "aA azee + B => C=".gsub(/(<?=>)|[^[:upper:]+|^ ]/, '\1')

Результат: A + B => C

person ctwheels    schedule 09.04.2018
comment
Я предпочитаю это решение, потому что оно явно исключает символы, а не включает строки, которые должны быть сохранены. Кроме того, выражение POSIX для прописных букв имеет более широкое применение, чем A-Z. - person Cary Swoveland; 09.04.2018

r = /[a-z\s[:punct:]&&[^+ |^]]/

"The cat, 'Boots', had 9+5=4 ^lIVEs^ leF|t.".gsub(r,'')
  #=> "T  B  9+54 ^IVE^ F|"

Регулярное выражение гласит: «Соответствует строчным буквам, пробелам и знакам препинания, которые не являются символами '+', ' ', '|' и '^'. && в классе символов — это оператор установить пересечение. Здесь он пересекает множество символы, соответствующие a-z\s[:punct:], с теми, которые соответствуют [^+ |^]. (Обратите внимание, что это включает в себя пробелы, отличные от пробелов.) Для получения дополнительной информации выполните поиск «классы символов также поддерживают оператор &&» в Регулярное выражение.

Я не включил '=>' и '<=>', так как они, в отличие от '+', ' ', '|' и '^', представляют собой многосимвольные строки и поэтому требуют другого подхода, чем простое удаление определенных символов.

person Cary Swoveland    schedule 02.11.2019