正则表达式忽略下划线

5
我有一个正则表达式([-@.\/,':\w]*[\w])*,它可以匹配文本中的所有单词(包括像 I.B.M 这样的标点符号单词),但是我想排除下划线并且似乎无法弄清楚如何做到这一点... 我尝试添加 ^[_] (例如 (^[_][-@.\/,':\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 不应匹配。

^[_] 应该改为 [^_]。前者将匹配字符串(或多行)开头的 _ - Mike Park
@climbage,那确实有帮助忽略下划线,但单词中的下划线仍然存在。 - Kiril
3个回答

6
尝试使用以下方法代替:
([-@.\/,':\p{L}\p{Nd}]*[\p{L}\p{Nd}])*
\w 类是由 [\p{L}\p{Nd}\p{Pc}] 组成的,当您执行 Unicode 匹配时使用该类。(如果您执行非 Unicode 匹配,则仅使用 [a-zA-Z0-9]。)
它是 \p{Pc} Unicode 类别——标点符号/连接符——导致匹配下划线的问题,因此我们明确针对其他类别进行匹配而不包括该类别。
(更多信息请参见此处:"字符类:单词字符" 和此处:"字符类:支持的 Unicode 通用类别"。)

1
\p{L}[\p{Ll}\p{Lu}\p{Lt}\p{Lo}\p{Lm}]相同,可以显著减少正则表达式的长度。请参阅支持的Unicode通用类别 - jb.

2

下划线来自于\w

只需使用A-Za-z0-9即可。


嗨,sidyll,感谢你提供的信息,但不幸的是我不能使用A-Za-z0-9,因为我必须匹配无论哪种语言的单词(可能是中文、俄语、日语、德语、英语)。 - Kiril

1

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

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

我只是使用了\p{L}代替Lu, Ll, Lt, Lo, Lm。请参见支持的Unicode通用类别


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接