如何使用RegExp从文本中删除除ä,ö和ü以外的所有非单词字符

时间:2019-10-08 11:26:31

标签: regex ruby

我有一个文件,我想从中删除所有非单词字符,但äöü除外,它们是德语中的变异元音。有没有办法做word.gsub!(/\W/, '')并将异常放入其中?

示例:

text = "übung bzw. äffchen"
text.gsub!(/\W/, '').

现在它将返回"bungbzwffchen"。它会删除非单词字符,但也会删除我想保留的变异元音üä

2 个答案:

答案 0 :(得分:4)

您可以通过使用某种否定性回溯来定义排除列表,但我认为最简单的方法是仅使用\w而不是\W来否定整个小组:

word.gsub!(/[^\wÄäÖöÜü]/, '') 

您还可以使用word.gsub(/[^\p{Letter}]/, ''),它应该删除未在Unicode中列为“字母”的所有字符。

您在问题中提到德语元音,我想在这里值得注意的是德语字母还包含long-:ẞ/ß

更新:

要回答您的原始问题,定义排除列表,请使用“负向后看” (?<!pat)

word.gsub(/\W(?<![ÄäÖöÅåẞß])/, '')

答案 1 :(得分:0)

您可以在字符类中使用&&运算符:

text = "übung bzw. äffchen  ÄÖÜ"

text.gsub(/[\W&&[^äÄöÖüÜ]]/, '')
  #=> "übungbzwäffchenÄÖÜ"

正则表达式为:“将通过将所有非单词字符的集合与除字符串"äÄöÖüÜ"之外的所有其他字符的集合相交而形成的字符集中的一个字符进行匹配。请参阅{{3 }}(搜索“ &&运算符”)。