2012-10-16 35 views
0

我想查找一些没有被任何数字或字母数字包围或没有包围的单词。 所以,如果我在寻找Foo123我想这个结果不包含数字或字母数字的图案

="Foo123"; =>TRUE 
barFoo123; =>FALSE 
Foo123 =>TRUE 
BarBar123Foo123Bar; =>FALSE 
;Foo123 =>TRUE 

我刚刚建立了这个表达式:

(^[^0-9a-zA-Z]?)WORDTOFIND([^0-9a-zA-Z]?$) 

我敢肯定,我在正确的道路,但是,当我像这样使用它:

if (Regex.IsMatch(line, string.Format(@"(^[^0-9a-zA-Z]?){0}([^0-9a-zA-Z]?$)",snCode))) 
{ 
} 

它不起作用。我究竟做错了什么?

回答

3

你基本上找

(?<![a-zA-Z0-9])Foo123(?![a-zA-Z0-9]) 

它使用一个前瞻和回顾后,确保没有一个字母数字字符之前或之后Foo123。尽管如此,这还是采用ASCII。

+1

权,重要的区别是,你说'Foo123'不能由字母数字字符开头,而不是说必须先由字符串的开始处的可选非字母数字字符组成。你清楚地表达意图,并且通常会得到很好的结果。 – hvd

+0

这不起作用,但你以前的做法是:(?<=^| [^ a-zA-Z0-9])Foo123(?= $ | [^ a-zA-Z0-9])有人能告诉我什么是<=? – bAN

+1

不,它的工作原理。 @Joey忘了删除其中的一个:'(?![^ a-zA-Z0-9])'应该是'(?![a-zA-Z0-9])'。 –

0

以下字符串匹配你不想这么做!Regex.IsMatch()

(^([0-9a-zA-Z])+{0}.*)|(.*{0}([0-9a-zA-Z])+) 
+0

点#1无关紧要:如果'[a-zA-Z0-9]'为真,那么按照定义'[a-zA-Z0-9] +'也是真的。正如@乔伊的回答所证明的,第2点是通过使用负面的lookarounds而不是否定的字符类来解决的。 –

+0

@AlanMoore 1)理解2)决定给我的答案,因为乔伊的答案在“barFoo123;”上失败。现在它已被标记为已被接受。更新了我的答案。 – tilish

相关问题