использование отрицательных условий в регулярных выражениях

#ruby #regex #gsub

#ruby #регулярное выражение #gsub

Вопрос:

Возможно ли использовать отрицательные соответствия в выражениях gsub? Я хочу заменить строки, начинающиеся на, hello кроме тех, которые начинаются на hello Peter

 my-string.gsub(/^hello@/i, '')
  

Что я должен поставить вместо @ ?

Комментарии:

1. Ваш вопрос неясен. Если строка начинается с «hello», где она заканчивается? Я полагаю, вы имеете в виду не просто строку «hello».

2. Извините, я думаю, что «строки, начинающиеся с», означают любую строку, которая начинается с этого шаблона, и не указывают, что идет после этого… любое предложение, чтобы сделать его более понятным, и я отредактирую его для записи.

3. Начальная часть понятна. Что неясно, так это то, где это заканчивается. Вас просто интересуют строки «hello» или строки, начинающиеся с «hello» и продолжающиеся на некоторую длину? Я думал, вы хотите последнее, и если это так, следующий ответ будет подходящим. Если вы хотели просто «привет», то ответ Майкла хорош.

4. Я имею в виду последнее, хотя простое «привет» (поскольку за ним не следует «питер») также должно соответствовать. Возможно, я что-то упускаю, но, кроме положения пробела, оба ответа кажутся мне правильными… Ответ Майкла улавливает строки любой длины и количества слов для меня.

5. Майкл будет работать с поиском, но пропустит пару случаев. We are martians and we say 'hello peter' all the time будет соответствовать. hello один не будет соответствовать.

Ответ №1:

Звучит так, как будто вам нужен негативный прогноз:

 >> "hello foo".gsub(/hello (?!peter)/, 'lala ') #=> "lala foo"
>> "hello peter".gsub(/hello (?!peter)/, 'lala ') #=> "hello peter"
  

Комментарии:

1. 1, отрицательные поисковые окна не так интуитивно понятны. Приятно видеть простой пример.

2. О да, это оно 🙂 Спасибо, Майкл!

3. Отлично, еще одно голосование против без объяснения причин. Если у вас фактическая проблема с ответом, почему бы не дать отзыв?

4. Майкл, смотри Следующий комментарий в комментариях к вопросу. Небольшого исправления будет достаточно. В любом случае, это было полностью полезно для меня, спасибо!

5. dgilperez: Я видел комментарий, но я не думаю, что он заслуживает отрицательного голосования. В любом случае, мы даже не уверены, что это был его, и, в конце концов, это действительно не имеет значения, если на ваш вопрос был дан ответ.

Ответ №2:

Как сказал Майкл, вам нужен негативный прогноз.

Для вашего примера это что-то вроде:

 my_string.gsub(/^hello(?! peter)( .*|$)/i, '')
  

Это заменит в таких случаях, как:

 "hello"
"hello Mom"
"hello "
"hello Mom and Dad"
  

И будет игнорировать такие вещи, как:

 "hello Peter"
"hello peter"
"hellomom"
"hello peter and tom"