我正在寻找一种使用PowerShell从字符串中导出单词的方法。我写了一个函数,可以从大写字母开始吐出每个字符的位置:
function Get-WordList {
[cmdletbinding()]
param(
[string]$InputString
)
$WordList = $inputString -csplit '\W+|(?<=[a-z0-9])(?=[A-Z])|(?<=[a-z])(?=[A-Z0-9])'
Return ($WordList | Select-Object -Unique)
}
字符串
我用字符串测试了这个:
Get-WordList -InputString "DeviceManagementGroup"
Get-WordList -InputString "SG-AD-XYZ-8021xAuth"
Get-WordList -InputString "Azure ATP mylab Viewers"
Get-WordList -InputString "SG-AZ-XYZ-MDM-WindowsBYOD-Devices-DYN"
Get-WordList -InputString "SG-AZ-XYZ-Entra-M365E5Licensed-Users"
Get-WordList -InputString "SG-AZ-UserGrp-Microsoft365ServiceAccounts"
Get-WordList -InputString "SG-AZ-UserGrp-AzureServiceAccounts"
Get-WordList -InputString "SG-AZ-DynDeviceGrp-Autopilot-AADJTagged"
型
这几乎100%的时间工作,除了当它涉及到多个大写字母在一排。在最后一个例子中,有AADJTagged。它认为它是一个词,我绑在分裂它像:
- Get-WordList -InputString“SG-AZ-DynDeviceGrp-Autopilot-AADJTagged”*
SG
AZ
Dyn
Device
Grp
Autopilot
AADJ
Tagged
型
相反,它是这样的:
SG
AZ
Dyn
Device
Grp
Autopilot
AADJTagged
型
我知道我在正则表达式中缺少了一些东西,比如对正则表达式的积极前瞻.有什么想法吗?
4条答案
按热度按时间e5njpo681#
试试下面的匹配模式。
字符串
输出
型
yebdmbv42#
假设一个“单词”必须以大写字母开头,这与它们匹配:
第一个月
所以它尝试了2场比赛:
你对数字的规则是什么?“-2-",“-A2-",“-2A-",“-2a-",“-a2-".包含单词吗?如果你有任何进一步的规范或更多的测试用例要考虑,请告诉我。
代码:
字符串
输出量:
型
k0pti3hp3#
这个正则表达式似乎可以做到这一点:
字符串
可能有一个更干净的正则表达式,但这是我能说的最好的。
smdnsysy4#
前言:
-csplit
(PowerShell的-split
-运算符的大小写敏感变体)构建,因此也输出根本不包含小写字母的单词。\p{Lu}
和\p{Ll}
(一致地),* 所有 * 和 * 字母都匹配,而不仅仅是 * 英文 *(ASCII范围)字母([A-Z]
和[a-z]
)。your own solution的一个更可读和更可维护的替代方案,它利用了inline regex option
(?x)
(IgnorePatternWhitespace
),它允许使用附带的空格和#
的行尾注解,以获得更好的可读性:字符串
Get-WordList
函数的行为与所需的增强相匹配:将AADJTagged
这样的单词拆分为AADJ
和Tagged
。M365E5
被拆分为M365
和E5
,这是基于推断的规则,即只有数字前面的**字母才能导致数字的拆分。(?x)
内联选项必须保持在封闭的逐字here-string字面量的第一行的开头。\W+
)和 positions(粉色)(匹配基于 *lookaroundAssert * 的后续子表达式)。PowerShell控制台中的输出:
型
[*]表达式(如
\p{Lu}
)用于表示大写字符,是Unicode字符 * 类别 *。请注意,除了大写字母和小写字母之外,还存在其他字母类别,如\p{Lt}
用于表示 * 标题大小写 * 字母。