2012-05-23 235 views
4

我想匹配包含仅限定字符的整个单词(或字符串)。正则表达式匹配仅包含某些字符的整个单词

例如,如果字母是dog

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 

...我希望以匹配doggodo(不是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'匹配退格,而不是字边界。为什么有人想要匹配一个我不知道的退格,但是一个字符类应该一次只能使用一个字符,并且字边界'\ 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

其中正则表达式的味道/工具您使用? (如JavaScript中,.NET,记事本+ +等)。如果它是一个支持先行和回顾后,你可以这样做:

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

这样一来,你就只能得到那些无论是在的开始比赛字符串或以空格开头,或在字符串的末尾或后面跟着空格。如果你不能使用回顾后(例如,如果你正在使用JavaScript),你可以拼出领先的条件:

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

在这种情况下,你会从中检索组#1匹配的词。但不要采取下一步,并尝试用(?:$|\s)替换lookahead。如果你这样做了,第一个命中(“狗”)将消耗尾随空间,正则表达式将无法使用它来匹配下一个单词(“上帝”)。

相关问题