2014-04-23 7 views
1

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

Microsoft have lunched her product office in 2003 

Я использую это регулярное выражение

(?mix:(microsoft).{1,100}(office)?.{0,100}(2003)?) 

но он не снимает офис. Он считает его одним из 100 символов.

+0

Это может не помочь (потому что 'office' является необязательным'), но попробуйте' {-1,100} 'для ваших подсчетов, которые (согласно помощи VIM) означают захват как можно меньше повторений. – TripeHound

+1

@TripeHound: вы говорите об лени, но этого недостаточно, чтобы решить проблему. Также этот шаблон обычно недействителен, вместо этого вы обычно используете '{0,100}?'. – Robin

+0

@Safouen: на каком языке вы используете? Почему модификатор 'x'? Если слова фиксированы, не проще ли просто проверить, есть ли каждый из них в строке, отдельно? – Robin

ответ

0

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 
} 

Дайте мне знать, если у вас есть вопросы.

+0

и есть ли способ, чтобы они не были в orerer, например, офис до microsoft. – Safouen

+0

@safouen Да. Например, если вы уверены, что хотите, чтобы Microsoftsoft и, возможно, другие, в любом порядке, вы можете использовать три вида: '\ A (? =. *? (Microsoft)) (? =. *? (Office)) (? =. *? \ s + (\ д +)). *? Microsoft' – zx81

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