首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用于自定义排序的PowerShell中的正则表达式

用于自定义排序的PowerShell中的正则表达式
EN

Stack Overflow用户
提问于 2019-10-10 12:05:20
回答 3查看 565关注 0票数 1

在两个系统之间的数据同步过程中,由于目标系统中的依赖关系,需要按照特定的顺序处理数据。从源系统检索的数据不按所需顺序排序。

在这种情况下,使用排序对象按字母顺序排序是行不通的:

代码语言:javascript
复制
$a | Sort-Object

因此,需要一个正则表达式来提取用于排序的字母和数字。

举例说明数据结构的样本数据:

代码语言:javascript
复制
$a = @('K1 Lorem ipsum','K2-2-2-1 Lorem ipsum','K1-1 Lorem ipsum','K2-7 Lorem ipsum','K1-1-1 Lorem ipsum','K1-4-2-8 Lorem ipsum','K2a Lorem ipsum','K2a-1 Lorem ipsum','K2a-1-1 Lorem ipsum','K2a-1-1-1 Lorem ipsum','K2-2-2-2 Lorem ipsum')

$a | Sort-Object

所需产出:

  • K1 Lorem ipsum
  • K1-1 Lorem ipsum
  • K1-1-1 Lorem ipsum
  • K1-4-2-8 Lorem ipsum
  • K2-2-2-1 Lorem ipsum
  • K2-2-2-2 Lorem ipsum
  • K2a Lorem ipsum
  • K2a-1 Lorem ipsum
  • K2a-1-1 Lorem ipsum
  • K2a-1-1-1 Lorem ipsum
  • K2-7 Lorem ipsum

实际产出:

  • K1 Lorem ipsum
  • K1-1 Lorem ipsum
  • K1-1-1 Lorem ipsum
  • K1-4-2-8 Lorem ipsum
  • K2-2-2-1 Lorem ipsum
  • K2-2-2-2 Lorem ipsum
  • K2-7 Lorem ipsum
  • K2a Lorem ipsum
  • K2a-1 Lorem ipsum
  • K2a-1-1 Lorem ipsum
  • K2a-1-1-1 Lorem ipsum

对于创建用于排序目的的自定义对象所需的正则表达式,任何要开始使用的指针都将不胜感激。

更新2019-10-10:

谢谢各位,很抱歉缺少信息。

我在发帖之前试过的内容,但没有包括因为我觉得我走错了方向:

代码语言:javascript
复制
$a = @('K1 Lorem ipsum','K2-2-2-1 Lorem ipsum','K1-1 Lorem ipsum','K2-7 Lorem ipsum','K1-1-1 Lorem ipsum','K1-4-2-8 Lorem ipsum','K2a Lorem ipsum','K2a-1 Lorem ipsum','K2a-1-1 Lorem ipsum','K2a-1-1-1 Lorem ipsum','K2-2-2-2 Lorem ipsum')

Foreach($b in $a){
    $null = $b.Name -match '(\D+)(\d+)'
    [PSCustomObject]@{
        Original = $b.Name
        Letters = $Matches[1]
        Number1 = [int]$Matches[2]
    }
}

无论如何,下次我一定要把它包括进去。

这是一个截图来自实际的源结构( Sharepoint )。

所需的输出应该与屏幕截图相同:

  • K1 Lorem ipsum
  • K1-1 Lorem ipsum
  • K1-1-1 Lorem ipsum
  • K1-4-2-8 Lorem ipsum
  • K2a Lorem ipsum
  • K2-5 Lorem ipsum
  • K2-5a Lorem ipsum
  • K2-5b Lorem ipsum
  • K2-5c Lorem ipsum
  • K2-5c-1 Lorem ipsum
  • K2-5c-2a
  • K2-5c-2b Lorem ipsum
  • K2-5c-2b-1 Lorem ipsum
  • K2-5c-2b-2 Lorem ipsum
  • K2-6 Lorem ipsum
  • K2-7 Lorem ipsum
  • K2b Lorem ipsum
  • K2b-1 Lorem ipsum
  • K2b-1-1 Lorem ipsum
  • K2b-1-2 Lorem ipsum

PowerShell中相同的列表(随机)

代码语言:javascript
复制
$a = @(

'K2-5c-2b-1 Lorem ipsum'
'K1-1-1 Lorem ipsum'
'K1-4-2-8 Lorem ipsum'
'K2-5b Lorem ipsum'
'K2-7 Lorem ipsum'
'K2a Lorem ipsum'
'K2-5 Lorem ipsum'
'K2-5c-2b Lorem ipsum'
'K1-1 Lorem ipsum'
'K2-5a Lorem ipsum'
'K1 Lorem ipsum'
'K2-5c Lorem ipsum'
'K2-6 Lorem ipsum'
'K2-5c-1 Lorem ipsum'
'K2b-1-1 Lorem ipsum'
'K2-5c-2a Lorem ipsum'
'K2-5c-2b-2 Lorem ipsum'
'K2b Lorem ipsum'
'K2b-1 Lorem ipsum'
'K2b-1-2 Lorem ipsum'
)

分类标准:

  • 标记中的数字(如K2)应该进行数字排序。
  • 按数字排序,后面跟着字母。例如,K2a应该在K3之前进行排序。此外,K2b应该在K2a之后而在K3之前排序。
  • 深度很重要,例如,K2a在K2-5之前。
  • 当在相同的深度水平时,没有以下字母的数字应该放在第一位。例如,K2-5出现在K2-5a之前。
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2019-10-11 07:17:05

这是痛苦的,因为你需要打破每一个条款,但这

代码语言:javascript
复制
$regex1=[regex]"(?i)^[a-z]+" 
$regex2=[regex]"(?i)(?<=^[a-z]+)\d+"
$regex3=[regex]"(?i)(?<=^[a-z]+\d+)[a-z]+" 
$regex4=[regex]"(?i)(?<=^[a-z]+\d+[a-z]*-)\d+" 
$regex5=[regex]"(?i)(?<=^[a-z]+\d+[a-z]*-\d+)[a-z]+" 
$regex6=[regex]"(?i)(?<=^[a-z]+\d+[a-z]*-\d+[a-z]*-)\d+"
$regex7=[regex]"(?i)(?<=^[a-z]+\d+[a-z]*-\d+[a-z]*-\d+)." 



$a = @(

'K2-5c-2b-1 Lorem ipsum'
'K1-1-1 Lorem ipsum'
'K1-4-2-8 Lorem ipsum'
'K2-5b Lorem ipsum'
'K2-7 Lorem ipsum'
'K2a Lorem ipsum'
'K2-5 Lorem ipsum'
'K2-5c-2b Lorem ipsum'
'K1-1 Lorem ipsum'
'K7-1 Lorem ipsum'
'K2-5a Lorem ipsum'
'K1 Lorem ipsum'
'K2-5c Lorem ipsum'
'K2-6 Lorem ipsum'
'K2-5c-1 Lorem ipsum'
'K2b-1-1 Lorem ipsum'
'K2-5c-2a Lorem ipsum'
'K2-5c-2b-2 Lorem ipsum'
'K2b Lorem ipsum'
'K2b-1 Lorem ipsum'
'K2b-1-2 Lorem ipsum'
) | sort @{e={$regex1.Match($_).Value}}, @{e={$regex2.Match($_).Value -as [int]} },  
         @{e={$regex3.Match($_).Value}}, @{e={$regex4.Match($_).Value -as [int]} }, 
         @{e={$regex5.Match($_).Value}}, @{e={$regex6.Match($_).Value -as [int]}} ,
         @{e={$regex7.Match($_).Value}}

编辑-第一个版本没有as int,因此2位数字不能正确排序,从而产生以下结果

代码语言:javascript
复制
K1 Lorem ipsum
K1-1 Lorem ipsum
K1-1-1 Lorem ipsum
K1-4-2-8 Lorem ipsum
K2-5 Lorem ipsum
K2-5a Lorem ipsum
K2-5b Lorem ipsum
K2-5c Lorem ipsum
K2-5c-1 Lorem ipsum
K2-5c-2a Lorem ipsum
K2-5c-2b-2 Lorem ipsum
K2-5c-2b-1 Lorem ipsum
K2-5c-2b Lorem ipsum
K2-6 Lorem ipsum
K2-7 Lorem ipsum
K2a Lorem ipsum
K2b Lorem ipsum
K2b-1 Lorem ipsum
K2b-1-1 Lorem ipsum
K2b-1-2 Lorem ipsum
K7-1 Lorem ipsum
票数 0
EN

Stack Overflow用户

发布于 2019-10-11 06:10:42

所需的输出不遵循给定的规则,特别是规则。

  • 深度问题,例如,K2a在K2-5之前出现。

与所需的顺序不兼容。

代码语言:javascript
复制
K2a Lorem ipsum
K2-5 Lorem ipsum
K2-6 Lorem ipsum
K2-7 Lorem ipsum
K2b Lorem ipsum

屏幕截图显示数据是在树结构中组织的。显然,这个结构有一个内在的布局,不可能仅仅通过按任何规则进行排序来重建。

票数 0
EN

Stack Overflow用户

发布于 2019-10-11 08:04:34

发了那么长的答案后,我就去刮胡子了。像这样想。“他们不应该使用5a,5b,如果他们使用5-a,5-b,那么它就会把--放在任何地方,后面有一个数字,前面有一个字母。”

代码语言:javascript
复制
sort @{e={$_ -replace "(?<=\d)(?=[a-z])","-"}}

它将处理多个字母,但多个数字将被错误地处理,因此

代码语言:javascript
复制
sort @{e={$_ -replace "(?<=\d)(?=[a-z])","-" -replace "(?<=\D)(?=\d\D|\d$)","0"}}

做同样的事情,并说,如果你发现一个位置前面有一个非数字,后面跟着一个数字和一个非数字,或者一个数字在字符串的末尾,然后在那个空格中放一个0。如果您有三位数,您可以添加另一个寻找两位数的数字。

代码语言:javascript
复制
-replace  "(?<=\D)(?=\d\d\D|\d\d$)","0"
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58322520

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档