【问题标题】:Regex ignore underscores正则表达式忽略下划线
【发布时间】:2011-07-26 12:21:55
【问题描述】:

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

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

附:

  • 我的应用是用 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 不应匹配。

【问题讨论】:

  • ^[_] 应该是 [^_]。前者将匹配字符串开头的_(如果是多行则匹配行)。
  • @climbage,这肯定有助于忽略下划线,但单词中的下划线仍然存在。

标签: c# regex regex-negation


【解决方案1】:

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

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

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

【讨论】:

    【解决方案2】:

    试试这个:

    ([-@.\/,':\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"。)

    【讨论】:

    【解决方案3】:

    周二下划线来自\w

    只需改用A-Za-z0-9

    【讨论】:

    • 嘿 sidyll,感谢您的信息,但不幸的是我无法使用 A-Za-z0-9,因为无论语言如何(可能是中文、俄语、日语、德语),我都必须匹配单词, 英语)。
    猜你喜欢
    • 2016-01-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多