匹配高位 ASCII 字符(但不包括字母 i)
Match high ASCII characters (but not the letter i)
我正在尝试使用 powershell 匹配所有高位 ASCII 和特殊 utf-8 字符:
gc $file -readcount 0 | select-string -allmatches -pattern "[\x80-\uffff]"
应该可以找到我想要的所有字符。但是,正则表达式似乎失败了,因为它匹配字符 "i"
和 "I"
.
我运行这个要测试,我很困惑:
"abcdefghijklmnopqrstuvwxyz" | select-string -allmatches -pattern "[\x80-\uffff]"
为什么匹配"i"
?我也没有得到的是,如果您将字符转换为 int,则值为 105,这显然不在指定的 运行ge 范围内。
原因是 i
在 U+0130
上匹配 (İ
, "Latin Capital Letter I with dot above"), a variant of capital I
found in Turkish:
PS C:\> 'i' -match '[\u0130]'
True
尝试反转模式:
"abcdefghijklmnopqrstuvwxyz" | Select-String -AllMatches -Pattern "[^\x00-\x79]"
以下是我的发现:
0x80..0xffff |ForEach-Object {
$CharCode = $_.ToString("X4")
if('i' -match "[\u$CharCode]"){
"U+$CharCode matches"
}
}
区分大小写是解决这个奇怪的土耳其 İ
错误的另一种方法。上面有个小点。
"abcdefghijklmnopqrstuvwxyz" |
select-string -allmatches -pattern "[\x80-\uffff]" -casesensitive
或者这个,但是字母 i
(小写或大写)会在不区分大小写的情况下通过:
# not 0-127
"abcdefghijklmnopqrstuvwxyz" |
select-string -allmatches -pattern "\P{IsBasicLatin}" -casesensitive
那个外来字符的小写被认为是英文小写字母i
。但它并没有以另一种方式映射(在我们的文化中)。
'İ'.tolower()
i
'i'.toupper()
I
开尔文 K
似乎也有问题。它的小写字母是一个普通的小 'k'。当忽略大小写时,它被视为ascii。我不确定为什么它的行为与土耳其语不同İ
。
[char]0x212a | select-string '\P{IsBasicLatin}' # no output
我正在尝试使用 powershell 匹配所有高位 ASCII 和特殊 utf-8 字符:
gc $file -readcount 0 | select-string -allmatches -pattern "[\x80-\uffff]"
应该可以找到我想要的所有字符。但是,正则表达式似乎失败了,因为它匹配字符 "i"
和 "I"
.
我运行这个要测试,我很困惑:
"abcdefghijklmnopqrstuvwxyz" | select-string -allmatches -pattern "[\x80-\uffff]"
为什么匹配"i"
?我也没有得到的是,如果您将字符转换为 int,则值为 105,这显然不在指定的 运行ge 范围内。
原因是 i
在 U+0130
上匹配 (İ
, "Latin Capital Letter I with dot above"), a variant of capital I
found in Turkish:
PS C:\> 'i' -match '[\u0130]'
True
尝试反转模式:
"abcdefghijklmnopqrstuvwxyz" | Select-String -AllMatches -Pattern "[^\x00-\x79]"
以下是我的发现:
0x80..0xffff |ForEach-Object {
$CharCode = $_.ToString("X4")
if('i' -match "[\u$CharCode]"){
"U+$CharCode matches"
}
}
区分大小写是解决这个奇怪的土耳其 İ
错误的另一种方法。上面有个小点。
"abcdefghijklmnopqrstuvwxyz" |
select-string -allmatches -pattern "[\x80-\uffff]" -casesensitive
或者这个,但是字母 i
(小写或大写)会在不区分大小写的情况下通过:
# not 0-127
"abcdefghijklmnopqrstuvwxyz" |
select-string -allmatches -pattern "\P{IsBasicLatin}" -casesensitive
那个外来字符的小写被认为是英文小写字母i
。但它并没有以另一种方式映射(在我们的文化中)。
'İ'.tolower()
i
'i'.toupper()
I
开尔文 K
似乎也有问题。它的小写字母是一个普通的小 'k'。当忽略大小写时,它被视为ascii。我不确定为什么它的行为与土耳其语不同İ
。
[char]0x212a | select-string '\P{IsBasicLatin}' # no output