我有一个正则表达式([-@.\/,':\w]*[\w])*
,它匹配文本中的所有单词(包括像IBM这样的标点符号),但我想让它排除下划线,我似乎无法弄清楚如何去做。 ..我尝试添加^[_]
(例如(^[_][-@.\/,':\w]*[\w])*
),但它只是将所有单词分解为字母。我想保留单词匹配,但我不希望在其中包含带下划线的单词,也不希望单词完全由下划线组成。
这样做的正确方法是什么?
P.S。
更新
这是一个例子:
“I.B.M应该被解析为一个单词w_o_r_d!俄语也应该起作用:мплексисторическихсобытий。”
比赛应该是:
I.B.M.
should
be
parsed
as
one
word
Russian
should
work
too
мплекс
исторических
событий
请注意,w_o_r_d
不应匹配。
答案 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