如何使用正则表达式从文本中去除除ä、ö和ü之外的所有非单词字符。

4

我有一个文件,想要从中删除所有的非单词字符,但是德语语言中的变音元音字母äöü需要保留。是否可以在word.gsub!(/\W/, '')中添加例外?

例如:

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

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

3
请您提供一个检查用的例子吗?例如:“我期望 regex("abc") 返回 b”。谢谢。 - achempion
text = "übung bzw. äffchen" text.gsub!(/\W/, '') 现在它会返回“bungbzwffchen”。它删除了非单词字符,但也删除了我想保留的变异元音ü和ä。 - Ashman
3
好的,我会尽力以最简洁明了的方式进行翻译,确保不改变原文的意思。以下是需要翻译的内容:@AshmaN3D Edit your question instead of adding comments so people interested in answering the question don't have to dig through the comment section - Viktor
不要忘记 ẞ / ß - Kimmo Lehto
2个回答

6

您可以使用某种负向回溯的方式来定义一组排除对象,但我认为最简单的方法就是使用\w而不是\W并否定整个组:

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

您也可以使用word.gsub(/[^\p{Letter}]/, ''),这应该可以摆脱任何未列为Unicode中的“字母”的字符。
您在问题中提到了德语元音字母,我认为在这里值得注意的是,德语字母表还包括长s:ẞ / ß。
更新:
回答您最初的问题,要定义一个排除列表,您可以使用“负向先行断言”(?<!pat)
word.gsub(/\W(?<![ÄäÖöÅåẞß])/, '')

1
好的回答。也许值得澄清的是,\W 在本身上就是 [^\w] - 3limin4t0r
\p{...} 的文档可以在这里找到:https://ruby-doc.org/core-2.6.5/doc/regexp_rdoc.html#label-Character+Properties。 - 3limin4t0r
那么\W和[^\w]是一样的吗?但为什么[^\w]可以工作而\W不行呢? - Ashman
1
“^” 只在字符类 [^…] 中起作用,但您可以将 \w 放入字符类中以包括所有单词字符。如果您只想要小写字母,则可以使用 [a-zäöü] - Kimmo Lehto
\W also just defines a character class and is a shorthand for something like [ ,.-()=!"#] - Kimmo Lehto

0
你可以在字符类中使用 && 运算符:
text = "übung bzw. äffchen  ÄÖÜ"

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

正则表达式的意思是“匹配一个字符,该字符属于所有非单词字符与不在字符串"äÄöÖüÜ"中的所有字符的交集所形成的字符集合”。请参见Regexp(搜索"&& operator")。

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