2012-05-23 3 views
4

Я хочу совместить целые слова (или строки действительно), содержащие только определенные символы.regex для соответствия целым словам, содержащим только определенные символы.

Например, если буквы d, o, g:

dog = match 
god = match 
ogd = match 
dogs = no match (because the string also has an "s" which is not defined) 
gods = no match 
doog = match 
gd = match 

В этом предложении:

dog god ogd, dogs o 

... Я бы ожидать, чтобы соответствовать на dog, god и o (не ogd, из-за запятой или dogs из-за s)

ответ

4

Следующая регулярное выражение представляет собой один или более вхождений трех символов, которые вы ищете:

[dog]+ 

Объяснение:

квадратные скобки означают: «любой из вложенных символов».

Знак плюс означает: «один или более вхождений предыдущего выражения»

Это будет точно такая же вещь:

[ogd]+ 
1

В зависимости от языка, это должно делать то, что вы нужно это делать. Это будет только соответствовать тому, что вы сказали выше;

это регулярное выражение:

[dog]+(?![\w,]) 

в строке ..

dog god ogd, dogs o 

будет соответствовать только ..

dog, god, and o 

Example in javascript

Example in php

Что-нибудь между двумя [] (скобки) - это класс символов .. он будет соответствовать любому символу между скобками. Вы также можете использовать диапазоны. [0-9], [a-z] и т. Д., Но он будет соответствовать только 1 символу. + и * являются квантификаторами. + выполняет поиск 1 или более символов, в то время как * выполняет поиск нулевого или более символов. Вы можете явно указать диапазон символов в фигурные скобки ({}), поставив цифру или несколько цифр в промежутке между: {2} будет соответствовать только 2 символов, в то время как {1,3} будет соответствовать 1 или 3.

Все между () скобку можно использовать для обратных вызовов, скажем, вы хотите вернуть или использовать значения, возвращаемые в качестве замены в строке. ?? является отрицательным взглядом, он не будет соответствовать классу символов после него, чтобы гарантировать, что строки с символами равны , а не, если они присутствуют.

+0

'[\ w \ b,]' неверно. Внутри класса символов '\ b' соответствует обратному пространству, а не границе слова. Почему кто-то хочет совпадение с backspace, которого я не знаю, но класс символов должен потреблять ровно один символ за раз, а слово-граница '\ b' ничего не потребляет. –

+0

Я не знал об этом. Закрепление. – Daedalus

9

Это должно работать для вас

\b[dog]+\b(?![,]) 

Объяснение

r""" 
\b  # Assert position at a word boundary 
[dog]  # Match a single character present in the list “dog” 
    +   # Between one and unlimited times, as many times as possible, giving back as needed (greedy) 
\b  # Assert position at a word boundary 
(?!  # Assert that it is impossible to match the regex below starting at this position (negative lookahead) 
    [,]  # Match the character “,” 
) 
""" 
+2

У вас есть деньги, и ваша шляпа перевернулась! (обменять $ и ^) – jahroy

+0

@jahroy Спасибо за указание. Ред. –

+0

Ты думал о своих деньгах и своих деньгах ... (Снуп Догг, Джин и Сок) – jahroy

2

Какой Regex вкусами/инструмент вы используете? (Например, JavaScript, .NET, Notepad ++, и т.д.) Если это тот, который поддерживает предпросмотр и назад ', вы можете сделать это:

(?<!\S)[dog]+(?!\S) 

Таким образом, вы получите только матчи, которые либо в начале строка или предшествует пробелу, или в конце строки, или за ней пробелы. Если вы не можете использовать просмотр назад (например, если вы используете JavaScript), вы можете сформулировать ведущее условие:

(?:^|\s)([dog]+)(?!\S) 

В этом случае вы бы извлечь подходящее слово из группы № 1. Но не делайте следующего шага и пытайтесь заменить lookahead на (?:$|\s). Если вы это сделали, первый хит («собака») будет потреблять конечное пространство, и регулярное выражение не сможет использовать его для соответствия следующему слову («бог»).

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