不可读的字符串与仅包含可读字符的正则表达式匹配

ka3ak

考虑以下命令:

STR="Êîðîëü è Øóò"; # Invalid (Russian in unrecognized encoding)
#STR="а б в г д"; # Valid (Russian)
#STR="a b c d e"; # Valid (English)
#STR="a b c d e а б в г д"; # Valid (English and Russian)



# The regex consists of latin and Russian characters
REGEX="^[a-zA-Zа-яА-Я ]+$"

if ! [[ "$STR" =~ $REGEX ]] ; then
  echo "Unreadable string: ""$STR";
fi


$ echo $LC_ALL
ru_RU.UTF-8

我期望"Unreadable string: Êîðîëü è Øóò"作为输出,但没有任何输出。

斯蒂芬·查泽拉斯(Stephane Chazelas)

除了在POSIX语言环境中(不是,很明显)POSIX未指定喜欢A-Zа-я匹配的范围A-Zа-я

只有在POSIX语言环境中,才能保证[A-Z]ABCDEFGHIJKLMNOPQRSTUVWXYZ字符匹配

在其他语言环境中,行为在实现之间会有所不同。有些匹配可能在排序之后A和之前排序的任何归类元素(可以是字符或字符序列)上匹配Z(可以包括chxÁ,但不Ź包括),或者它们可以匹配代码点大于A和小于的字符。是的Z在语言环境的字符集,或者也可以在另外一个不同的方式使用的语言环境的整理数据......另外请注意,不是每个人都同意的字母(在这种情况下,像拉丁文或西里尔文)任何给定的脚本的顺序,所以你会在不同的语言环境中获得不同的行为,这些语言环境将那些脚本包含在它们的字符集中(即使它是相同的字符集))。

如果要匹配任何脚本中的任何字母字符,请使用[[:alpha:]],如果要基于UTF-8中的代码点匹配字符范围,则可以尝试使用C.UTF-8许多系统上可用语言环境。

如果你想在拉丁文字的任何字母匹配,你可以使用perlpcre\p{Latin}(包括éÊ...)。zsh

set -o rematchpcre
[[ $x =~ '^(\p{Latin}|\p{Cyrillic})$' ]]

您可以将拉丁字母限制为仅在ASCII中使用的字母(仍然带有zsh和仍然带有rematchpcre):

[[ $x =~ '^((?=[[:ascii:]])\p{Latin}|\p{Cyrillic})$' ]]

尽管与一起生效rematchpcre,但^([a-zA-Z]|\p{Cyrillic})$会具有相同的效果,因为PCRE和inzsh中的范围基于代码点值,并且保证这些字母具有相同的代码点,并且使用英文字母序列,且所有语言环境均基于ASCII和基于EBCDIC的POSIX至少系统。

或者,如果只想要一个子集,则可以显式列出字符,以避免所有歧义:

[[ $x =~ ^[ABC...XYZabc...xyzабв...эюя]$ ]]

您始终可以将它们存储在变量中,例如:

ascii_upper=ABC...XYZ
ascii_lower=abc...xzy
cyr_upper=...
[[ $x =~ ^[$ascii_upper$ascii_lower$cyr_upper...]$ ]]

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

正则表达式,仅与包含某些特定字符的字符串匹配

来自分类Dev

如果字符串仅包含空格,则匹配的正则表达式是否匹配?

来自分类Dev

正则表达式模式以获取所有可读ascii的子字符串

来自分类Dev

正则表达式:如果链接仅包含特定字符串则匹配

来自分类Dev

正则表达式匹配不包含字符串的字符串

来自分类Dev

正则表达式匹配不包含子字符串的字符串

来自分类Dev

正则表达式以匹配包含以点分隔的子字符串的字符串

来自分类Dev

从仅与正则表达式模式匹配的字符串中提取字符

来自分类Dev

Javascript正则表达式匹配字符串,仅出现__个字符

来自分类Dev

正则表达式-替换仅包含一个但重复字符的字符串

来自分类常见问题

分割不包含与Java中的正则表达式匹配的相邻字符的字符串

来自分类Dev

正则表达式以匹配包含特殊字符的数字字符串

来自分类Dev

正则表达式:如果字符串包含自己,则匹配字符

来自分类Dev

正则表达式匹配至少不包含X个字符的字符串

来自分类Dev

使用正则表达式匹配包含数字和特殊字符的字符串

来自分类Dev

如何在包含某些字符的字符串中匹配正则表达式?

来自分类Dev

如果文本仅包含一个字符串,则匹配文本的正则表达式

来自分类Dev

正则表达式:匹配字符串中的单词,但仅当行不包含斜杠时

来自分类Dev

正则表达式 - 匹配仅包含数字并以特定数字开头的字符串

来自分类Dev

正则表达式查找仅包含数字的字符串,但仅在以 # 或 \s 开头且后跟空格时匹配

来自分类Dev

将正则表达式匹配项替换为包含匹配项的字符串

来自分类Dev

Perl正则表达式:字符串文字包含元字符作为匹配表达式的变量

来自分类Dev

使用正则表达式匹配字符串?

来自分类Dev

Java正则表达式匹配字符串

来自分类Dev

返回匹配正则表达式的字符串

来自分类Dev

匹配不带正则表达式的字符串

来自分类Dev

匹配任何字符串正则表达式

来自分类Dev

正则表达式以匹配Java字符串

来自分类Dev

Vim:匹配字符串的正则表达式

Related 相关文章

  1. 1

    正则表达式,仅与包含某些特定字符的字符串匹配

  2. 2

    如果字符串仅包含空格,则匹配的正则表达式是否匹配?

  3. 3

    正则表达式模式以获取所有可读ascii的子字符串

  4. 4

    正则表达式:如果链接仅包含特定字符串则匹配

  5. 5

    正则表达式匹配不包含字符串的字符串

  6. 6

    正则表达式匹配不包含子字符串的字符串

  7. 7

    正则表达式以匹配包含以点分隔的子字符串的字符串

  8. 8

    从仅与正则表达式模式匹配的字符串中提取字符

  9. 9

    Javascript正则表达式匹配字符串,仅出现__个字符

  10. 10

    正则表达式-替换仅包含一个但重复字符的字符串

  11. 11

    分割不包含与Java中的正则表达式匹配的相邻字符的字符串

  12. 12

    正则表达式以匹配包含特殊字符的数字字符串

  13. 13

    正则表达式:如果字符串包含自己,则匹配字符

  14. 14

    正则表达式匹配至少不包含X个字符的字符串

  15. 15

    使用正则表达式匹配包含数字和特殊字符的字符串

  16. 16

    如何在包含某些字符的字符串中匹配正则表达式?

  17. 17

    如果文本仅包含一个字符串,则匹配文本的正则表达式

  18. 18

    正则表达式:匹配字符串中的单词,但仅当行不包含斜杠时

  19. 19

    正则表达式 - 匹配仅包含数字并以特定数字开头的字符串

  20. 20

    正则表达式查找仅包含数字的字符串,但仅在以 # 或 \s 开头且后跟空格时匹配

  21. 21

    将正则表达式匹配项替换为包含匹配项的字符串

  22. 22

    Perl正则表达式:字符串文字包含元字符作为匹配表达式的变量

  23. 23

    使用正则表达式匹配字符串?

  24. 24

    Java正则表达式匹配字符串

  25. 25

    返回匹配正则表达式的字符串

  26. 26

    匹配不带正则表达式的字符串

  27. 27

    匹配任何字符串正则表达式

  28. 28

    正则表达式以匹配Java字符串

  29. 29

    Vim:匹配字符串的正则表达式

热门标签

归档