2016-09-19 2 views
2

Say,найти все слова, которые содержат `p`, но не` ph`

str = 'python php ruby javascript jsonp perhapsphpisoutdated' 

Как найти все слова, которые содержат p но не ph с помощью регулярных выражений?

Я знаю, как решить эту проблему с split & filter:

str.split(' ') 
    .filter(w=>w.includes('p') && !w.includes('ph')) 

Есть ли возможно регулярное выражение способ?

+0

А что правильный ответ здесь? –

+0

@ WiktorStribiżew Является ли не вопрос достаточно ясным? – undefined

+0

Я имею в виду, что если слово содержит 'p' без' h' после него и 'ph', это должно быть проигнорировано? Сейчас я получаю 3. –

ответ

9

Вы можете использовать следующее решение:

var str = 'python php ruby javascript jsonp perhapsphpisoutdated'; 
 
var res = str.match(/\b(?!\w*ph)\w*p\w*/g); 
 
console.log(res);

Описание:

  • \b - ведущий границы слова
  • (?!\w*ph) - с отрицательный предпросмотр требует, что не может быть ph после 0+ слова символов, которые появляются сразу после ведущего слова граничного
  • \w* - 0+ слово символов
  • p - письмо p
  • \w* - 0+ слово символов.

Примечание что \w соответствующие буквы, цифры и символы подчеркивания могут быть заменены [a-zA-Z] только матч ASCII буквами.

Визуализация:

https://jex.im/regulex/#!embed=false&flags=&re=%5Cb(%3F!%5Cw*ph)%5Cw*p%5Cw*

+0

FYI, здесь [демо-версия regex] (https://regex101.com/r/tY2pI6/ 2). Чтобы не учитывать регистр-insensitively, используйте '/ \ b (?! \ W * ph) \ w * p \ w */gi' –

+0

Ну, я прочитал вопрос как« получить счетчик * слов »- .length' является излишним, если сами слова должны быть извлечены. Спасибо, @jcubic. –

+0

Аккуратное изображение. Какая система/веб-сайт дал вам эту информацию. Я мог бы использовать это для других целей. – BSD

1

Это на самом деле то, что вы могли бы сделать целый ряд различных способов. Я предлагаю вам использовать https://www.cheatography.com/davechild/cheat-sheets/regular-expressions/ и посмотреть на квантификаторы и сопоставить. Вы также можете прочитать вслух: http://www.regular-expressions.info/lookaround.html

Вот пара идей.

p{1}h{0} это говорит именно 1 р следует ровно 0 ч

p[^h] это говорит р а затем ничего, что не ч (это не будет соответствовать «р» сам по себе)

p(?!h) Мне это нравится ONE BEST, так как использует функцию поиска в Regex. Он говорит, p, за ним следует «h»? Нет? Тогда это хорошо.

Удачи.

+0

Это то, что я, хотя и использую, но, кажется, 'возможноphpisoutdated' также должно быть исключено из count, поскольку оно содержит' ph'. –

+0

Возможно, я предъявил ваш иск неверно. Я бы подумал, что это разрешено, потому что это было совпадение на стр. Я пытался исключить любое использование ph, но если вы хотите исключить любое WORD, которое содержит ph, то решение Wiktor лучше. – BSD

+0

'/ p {1} h {0} /' имеет ту же семантику, что и '/ p /'. '{0}' полезен только в ароматах, поддерживающих вызовы подпрограмм (JavaScript не работает), а '{1}' - чистый шум. –

0

This не соответствует ни одному слову, содержащему «ph» или не содержит «p».

\b(?:p(?!h)|[^p\s])*?p(?!h)(?:p(?!h)|[^p\s])*?\b 
0

Я даю вам исполняемый код, я перепутать последовательность! W.includes ('тела') & w.includes ('р'). А Javascript выполнение даного

var str = 'python php ruby javascript jsonp perhapsphpisoutdated'; 
 
var res=str.split(' ').filter(w=> !w.includes('ph') && w.includes('p')) 
 
console.log(res);

+0

Это именно то, что делает OP уже. Вопрос заключался в том, как сделать то же самое с регулярным выражением. –

+0

Хорошо, спасибо за освобождение путаницы –

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