【问题标题】:Select-String of Invalid Character (For Germany Language)选择无效字符的字符串(对于德语)
【发布时间】:2017-10-24 17:18:10
【问题描述】:

我希望在 .csv 文件中捕获无效字符。目前我只能捕获所有非英语的无效字符,是否可以捕获除英语和 Germany 之外的所有无效字符?

以下代码可以过滤非英文字母的无效字符。

$path = "product.csv"

$a = Get-Content $path | Select-String -AllMatches -Pattern "[^\x00-\x79]" | Select-Object LineNumber,Line,@{Name='String';Expression={$_.Matches.Value}}
$b = $a.count

$a
Write-Host "Total:  $b"

人名中包含的所有德国字符都算作有效字符。

【问题讨论】:

  • 如果您想检查文件路径中的无效字符,请查看GetInvalidFileNameChars()
  • 不好意思我忘了说,这个get-content是读取.csv文件的内容,不是文件名。
  • 是否有意允许使用字符“[]”但不允许使用“{}”?
  • 到底什么是“无效字符”?这个概念没有意义。你想达到什么目的?
  • @Tomalak 嗨,谢谢你的提问。模式内的值是错误的,仅作为示例。这个脚本基本上扫描包含人名的 .csv 表单,日期这些公共属性,所以我将消除那些符号,如 !,* 被认为是人名、地址等的无效字符......跨度>

标签: regex powershell


【解决方案1】:

最简单的方法是将德语特定字符的十六进制文字添加到匹配组中。您要查找的字符是:

 ß \xdf
 Ü \xdc
 ü \xfc
 Ä \xc4
 ä \xe4
 Ö \xd6
 ö \xf6

所以你的新匹配组是:

-Pattern "[^\x00-\x79\xdf\xdc\xfc\xc4\xe4\xd6\xf6]"

编辑:

作为通过代码点匹配字符的替代方法,您还可以在匹配模式中使用实际字符:

-Pattern "[^a-zA-ZäÄöÖüÜß]"

它更易于阅读,并且不包含您在上面匹配的 \x00\x21 之间的所有这些非人类可读的控制字符。

【讨论】:

  • 嗨 Manuel Batsching,我在网上搜索有超过 7 个德语字符 link 。那么您提供的匹配组是正确的还是需要添加更多的德语字符?我可以知道你是如何得到十六进制值的吗?有没有可以查看完整列表的资源?稍后我可能需要进一步检查其他语言,例如中文、韩文。谢谢
  • 为什么十六进制转义?
  • @YongCai 作为一名德国人,我可以向您保证,您发现的这 7 个额外字符未在德语字母表中使用。
  • @Tomalak 十六进制转义不是必需的,但是当 OP 使用它时,我正在寻找一个尽可能接近 OP 代码的解决方案。
  • @ManuelBatsching 我可以知道从哪里得到这些字符的十六进制值吗?有链接吗?
猜你喜欢
  • 1970-01-01
  • 2022-11-05
  • 2023-03-08
  • 1970-01-01
  • 2017-12-14
  • 1970-01-01
  • 2014-04-22
  • 1970-01-01
  • 2021-09-02
相关资源
最近更新 更多