仅匹配正则表达式中的 ASCII 字母,忽略变音符号

仅匹配正则表达式中的 ASCII 字母,忽略变音符号

我在 bash 脚本中使用正则表达式,例如

REGEX="^[a-zA-Z0-9\-]+$"

我想过滤掉所有非标准单词,特别是包含德语特殊字符的单词äöüÄÖÜß

但根据本手册如果您将 LOCALE 设置为德语,则正则表达式a-z也包含ö

我该如何解决这个问题?

我已经尝试将脚本开头的区域设置设置为英语:

#!/bin/bash
LANG=en_US.utf8
LANGUAGE=en_US.utf8
LC_ALL=en_US.utf8
export LANG
export LANGUAGE
export LC_ALL

但没有效果。

我不想执行此解决方法并预先替换特殊字符:

tr _ -|tr . -|tr " " -|tr '[:upper:]' '[:lower:]'|sed 's/ä/ae/;s/ö/oe/;s/ü/ue/;s/ß/ss/g')

我宁愿学习正确的方法。

答案1

使用:

REGEXP='^[abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0-9-]+$'

选择您想要的字符。匹配的内容[a-z]仅保证位于[abcdefghijkmnopqrstuvwxyz]C/POSIX 语言环境中。

(我假设您不希望包含反斜杠,但这\是转义的错误尝试-)。

^[a-zA-Z0-9-]+$另一种选择是在使用评估扩展正则表达式(或)的工具之前将语言环境修复为 C ^[[:alnum:]-]+$,例如:

LC_ALL=C grep -Ee "$REGEXP"

这在这种情况下是有效的,但在像REGEXP='[A-Z]'匹配正则表达式的数据位于 BIG5-HKSCS 或 GB18030 等字符集中(以及使用相同字符的语言环境中)的情况下则不然,其中许多字符具有包含相同编码的编码作为那些A-Z

[A-Z]匹配Á(U+00C1,在 BIG5-HKSCS 中编码为 0x88 0x57(其中 0x57 也是W))的示例:

$ LC_ALL=zh_HK.big5hkscs REGEXP='[A-Z]' bash -c 'printf "\uc1\n" |
    LC_ALL=C grep -qe "$REGEXP" && echo match'
match

相关内容