正则表达式忽略下划线

时间:2011-03-30 23:52:57

标签: c# regex regex-negation

我有一个正则表达式([-@.\/,':\w]*[\w])*,它匹配文本中的所有单词(包括像IBM这样的标点符号),但我想让它排除下划线,我似乎无法弄清楚如何去做。 ..我尝试添加^[_](例如(^[_][-@.\/,':\w]*[\w])*),但它只是将所有单词分解为字母。我想保留单词匹配,但我不希望在其中包含带下划线的单词,也不希望单词完全由下划线组成。

这样做的正确方法是什么?

P.S。

  • 我的应用程序是用C#编写的(如果这有任何区别)。
  • 我不能使用A-Za-z0-9,因为我必须匹配单词而不管语言(可能是中文,俄语,日语,德语,英语)。

更新
这是一个例子:

“I.B.M应该被解析为一个单词w_o_r_d!俄语也应该起作用:мплексисторическихсобытий。”

比赛应该是:

I.B.M.  
should  
be  
parsed  
as  
one  
word  
Russian  
should  
work  
too  
мплекс  
исторических  
событий  

请注意,w_o_r_d不应匹配。

3 个答案:

答案 0 :(得分:6)

请改为尝试:

([-@.\/,':\p{L}\p{Nd}]*[\p{L}\p{Nd}])*

当您执行Unicode匹配时,\w类由[\p{L}\p{Nd}\p{Pc}]组成。 (或者,如果您正在进行非Unicode匹配,则只需[a-zA-Z0-9]。)

这是\p{Pc} Unicode类别 - 标点符号/连接符 - 通过匹配下划线导致问题,因此我们明确地与其他类别匹配而不包括那个。

(更多信息,请"Character Classes: Word Character",此处"Character Classes: Supported Unicode General Categories"。)

答案 1 :(得分:2)

Tue下划线来自\w

只需改为使用A-Za-z0-9

答案 2 :(得分:1)

对于LukeH正则表达式的更简洁版本,您可以简单地使用:

([-@.\/,':\p{L}]*\p{L})*

我只使用\p{L}代替Lu, Ll, Lt, Lo, Lm。见Supported Unicode General Categories