Safouen, здесь есть два варианта для вас.
Во-первых, если вы хотите задать максимум 100 символов между ними, как и прежде, использовать это:
(?mi)(microsoft).{1,100}?(?:(office).{1,100}?(?:(2003)|$)|$)
Он будет захватывать Microsoft, и, возможно, офис и 2003, если присутствует. Существуют различные способы написания этого, это только тот, который пришел на ум.
Во-вторых, если вы не заботитесь сколько символов между ними, просто заменить *
вместо {1,100}
:
(?mi)(microsoft).*?(?:(office).*?(?:(2003)|$)|$)
Для изучения матчей в Ruby, это может выглядеть следующим образом:
subject.scan(/(?mi)(microsoft).*?(?:(office).*?(?:(2003)|$)|$)/) {|result|
# If the regex has capturing groups, result is an array with the text matched by each group (but without the overall match)
# If the regex has no capturing groups, result is a string with the overall regex match
}
Дайте мне знать, если у вас есть вопросы.
Это может не помочь (потому что 'office' является необязательным'), но попробуйте' {-1,100} 'для ваших подсчетов, которые (согласно помощи VIM) означают захват как можно меньше повторений. – TripeHound
@TripeHound: вы говорите об лени, но этого недостаточно, чтобы решить проблему. Также этот шаблон обычно недействителен, вместо этого вы обычно используете '{0,100}?'. – Robin
@Safouen: на каком языке вы используете? Почему модификатор 'x'? Если слова фиксированы, не проще ли просто проверить, есть ли каждый из них в строке, отдельно? – Robin