查找字符串中的变音符号



我正在做一些搜索,发现了一个类似的主题Powershell查找文本文件中的非ascii字符

下面的函数不能处理所有情况,例如撇号或所有特殊字符

function IsStringDiacritic {
param (
[parameter(Mandatory = $True)][string]$String
)

If ($String -as [System.Net.Mail.MailAddress]) {
$String = $String.Split('@')[0]
}
Return [bool]($String -cmatch '[^x20-x7F]')
}

上面是我创建的函数,但是我没有得到我需要的。

我想先发送函数。最后,如果有变音符号,则返回真或假。

我的函数能够处理电子邮件地址以及测试,然后分割,但这不是主要部分。

我想我需要一个正则表达式,将首先看。最后一个还是第一个,但我不确定如何包括可能性。

有更好的主意吗?

看起来您的真正意图不是寻找带有变音符号的字符,而是要确保给定的名称-无论是单独指定的还是作为电子邮件地址的用户名部分(@之前的部分)-仅由组成

:
  • 小写ascii范围(英文)字母,即az
  • 一个.或空格(如果有的话)来分隔名称组件。

一个powershell惯用的解决方案是定义一个Test-Name函数来指示给定的名称是否有效:

function Test-Name {
param (
[Parameter(Mandatory)]
[string]$Name
)

$Name -cmatch '^[a-z]+(?:[. ][a-z]+)?(?:@.+)?$'
}

foo.barfoo barfoo.bar@example.orgfoobar@example.org调用Test-Name,生成$true,而föo.bärFoo.barfoo-bar.foobar生成$false

注意:

  • 如果大写英文字母也可以接受,将-cmatch替换为-match

  • 要允许额外的分隔符,将它们添加到[. ]字符集;例如,要包含-_,请使用[. _-](将-放在前面或最后,以便它不会被解释为范围字符的一部分,例如在[a-z]中)

  • (?:@.+)?匹配以@开头的所有内容,如果存在(但是除了必须包含至少一个字符外,对@后面的内容没有限制)。

  • 注意如何匹配整个字符串以确保名称不以.或空格开始结束,并且只有一个分隔符。

    • 如果你也想允许,比如说,三个名称组件(例如'foo.bar.baz'),使用以下正则表达式:
      • ^[a-z]+(?:[. ][a-z]+){0,2}(?:@.+)?$

目前看来可行的答案如下:

function IsStringDiacritic {
param (
[parameter(Mandatory = $True)][string]$String
)

If ($String -as [System.Net.Mail.MailAddress]) {
$String = $String.Split('@')[0]
}

If ($String -like '*.*') {
$String = $String.Replace('.', '')
}
$String = $String.Trim()

Return [bool]($String -cmatch '[^a-z]')
}

我原来的函数不能处理所有的情况,例如撇号或所有的特殊字符,有人可能在错误或故意使用。到目前为止,我的函数似乎告诉我是否有任何字符不是a到z。它的限制是英语。

最新更新