【问题标题】:select string with words and numbers选择带有单词和数字的字符串
【发布时间】:2019-08-30 04:47:18
【问题描述】:

尝试选择一个返回单词和数字的字符串,而不擦除输出的其余部分。

现在我有以下内容:

$files = @'
  Associations : 1, 2, 3, 4
  Transactions: 20, 21, 22

  Associations : 5, 6, 7, 8
  Transactions, 99, TRANS12, TRANS13, 97
    @'

$blob = $files -split '\r?\n'
$array = @()
[bool]$transBool = $false

$blob | ForEach-Object {
    if ($_ -match ':') {
        if ($_ -match '(Transactions)' -or $_ -match '(Tr)' -or $_ -match '(Trans)') {
            $Trans = ($_ -split ':')[-1].TrimStart(",").TrimEnd(",")
            $trans = $Trans -split ',' -replace " ", "" | select -Unique
            $transBool = $true
        } elseif ...

        if ($Trans -match '[A-Z]') {
            $transBool = $true
            $obj = New-Object PSObject -Property @{
            TransactionsAugust= $Trans

            $output = "{0}
  `Transactions for August : {1}" -f $output,
                      (($array.TransactionsAugust | Where-Object {$_ -like "[A-Z]*" -like "[0-9]" } | select -Unique) -join ",")

            Write-Host $output

我能够在我的输出中提取包含单词 TRANS 的所有事务,但它也摆脱了例如 99 和 97。

目标:String 能够捕获 TRANS12、TRANS13 并返回到名为 Transactions for August 的类别中。交易 99 和 97 将被拉到不同的类别中,称为另一个数组。

【问题讨论】:

  • 您有 3 个代码 sn-ps,其中 3 个不同的变量($files$Trans$output)似乎彼此之间没有任何关系。您的第一个代码 sn-p 中也有错字。请创建一个 minimal reproducible example 来展示您要解决的问题,然后 edit 您的问题并复制/粘贴该代码。
  • 我不想包含整个代码,这会是很多代码行
  • 我没有要求您提供您的整个代码。请再读一遍。

标签: powershell


【解决方案1】:

基于answer from Lee_Dailey中的变量定义

您可以使用Select-String cmdlet 简化匹配以检索相关值:

$InStuff | Select-String $TargetPattern -AllMatches | Foreach-Object {$_.Matches.Value}

注意:语法$_.Matches.Value(称为“属性枚举”)需要PSv3或更高版本,
对于 PSv2,使用 Select-Object -ExpandProperty cmdlet 参数。

【讨论】:

    【解决方案2】:

    我不擅长使用严格的正则表达式解决方案 [blush],所以这使用了一个非常简单的正则表达式模式。如果您可以让正则表达式大师为您提供复杂的模式,它可能会更快。

    代码的作用...

    • 伪造文件读取
      你的例子有几个错误,所以我使用了一个编辑版本。
    • 设置目标模式
      模式是单词trans 和一个或多个数字。
    • 使用-match 处理集合的方式来获取包含目标模式的任何行
    • , [空格和逗号] 上拆分
    • 修剪掉任何前导/尾随空格
    • 过滤任何包含目标模式的项目
    • 将其发送到$TargetItems 集合
    • 显示该集合中的项目

    这是代码...

    # fake reading in a text file
    #    in real life, use Get-Content
    $InStuff = @'
    Associations : 1, 2, 3, 4
    Transactions: 20, 21, 22 
    
    Associations : 5, 6, 7, 8
    Transactions, 99, TRANS12, TRANS13, 97
    '@ -split [System.Environment]::NewLine
    
    $TargetPattern = 'trans\d{1,}'
    
    $TargetItems = ($InStuff -match $TargetPattern -split ', ').
        Trim().
        Where({
            $_ -match $TargetPattern
            })
    
    $TargetItems
    

    输出...

    TRANS12
    TRANS13
    

    【讨论】:

    • 你太难了,只是:$InStuff | Select-String $TargetPattern -AllMatches | Foreach-Object {$_.Matches.Value}
    • @iRon - 哈!那更好-请将其作为答案发布,以便 OP 看到它。 [咧嘴]
    • 完成。无论如何,+1 的倡议和解释。
    猜你喜欢
    • 2023-01-07
    • 2018-02-17
    • 2021-05-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-04-12
    相关资源
    最近更新 更多