匹配高位ASCII字符

时间:2015-06-12 14:36:46

标签: regex powershell utf-8

我正在尝试使用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,这显然不在指定的范围内。

2 个答案:

答案 0 :(得分:1)

原因是i匹配U+0130("拉丁大写字母I上面有点"),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"
    }
}

答案 1 :(得分:0)

区分大小写是此奇怪的土耳其语İ错误的另一个解决方法。顶部有一个小点。

"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”。忽略大小写时将其视为ascii。我不确定为什么它的行为与土耳其语İ不同。

[char]0x212a | select-string '\P{IsBasicLatin}' # no output