我正在做一些搜索,发现了一个类似的主题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范围(英文)字母,即
a
至z
- 一个
.
或空格(如果有的话)来分隔名称组件。
一个powershell惯用的解决方案是定义一个Test-Name
函数来指示给定的名称是否有效:
function Test-Name {
param (
[Parameter(Mandatory)]
[string]$Name
)
$Name -cmatch '^[a-z]+(?:[. ][a-z]+)?(?:@.+)?$'
}
用foo.bar
、foo bar
、foo.bar@example.org
或foobar@example.org
调用Test-Name
,生成$true
,而föo.bär
、Foo.bar
、foo-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。它的限制是英语。