【问题标题】:Why has this PowerShell Object changed? What is the difference?为什么这个 PowerShell 对象发生了变化?有什么不同?
【发布时间】:2021-12-31 21:46:16
【问题描述】:
foreach ($line in $test) {
    $line.GetType()
    $newline = $line -split ("<.*?>") -split ("{.*?}") # remove html and css tags
    $newline.GetType()
}

我在尝试对 $newline 使用 .Trim() 方法时遇到了这个问题。它有效,但智能感知并没有表明它会。我以为.Trim() 只适用于字符串对象(BaseType:System.Object),但在这种情况下,它似乎也适用于 String[] 对象(BaseType:System.Array)。

$line.GetType() 返回

IsPublic IsSerial Name                                     BaseType                                                                                
-------- -------- ----                                     --------                                                                                
True     True     String                                   System.Object 

$newline.GetType() 返回

IsPublic IsSerial Name                                     BaseType                                                                                
-------- -------- ----                                     --------                                                                                
True     True     String[]                                 System.Array       

                        

首先,我想知道为什么我的原始字符串被转换为一个数组,假设它是-split的返回值...现在是一个字符数组吗?我有点困惑。

其次,如果有一个好的答案,为什么字符串方法对技术上的数组起作用?

来自 Python 和 C/C++,谢谢。

【问题讨论】:

  • 你打电话给-split了吗?字符串和数组都支持-split 操作。对于字符串,您将一个字符串拆分为一个字符串数组,在找到拆分模式的任何地方进行拆分。对于字符串数组,您可以获得所有字符串元素的串联,以相同的方式拆分。因此,如果您有一个包含 2 个元素的数组,并且您在两个元素中找到一个字母进行拆分,那么您现在有 4 个元素。
  • 所以基本上string -split 给出了字符串数组。 array -split 给出另一个数组。
  • @LasseV.Karlsen 所以 .Trim() 方法可以处理字符串数组吗?它是否将其应用于数组中的所有元素?
  • 对于在数组上调用 .Trim() 是否意味着 Powershell 在数组上定义了 Trim() 操作,或者当在数组上调用时,它是否解除了对元素的 Trim() 操作,我有点模糊,表示在每个元素上调用操作的另一个数组,但是是的,它将应用于每个元素。它会修剪每个元素,但不会修剪数组,这意味着如果第一个或最后一个元素是空格/空,它们仍然存在,它们只是空字符串。
  • Powershell 似乎提升了对数组的操作以暗示对每个元素的操作,从而产生一个新数组。我刚刚用.ToUpper().Substring(..) 等进行了测试。这可能在某处有很好的记录。

标签: arrays string powershell


【解决方案1】:

Santiago Squarzon's helpful answer 为您的代码尝试执行的操作提供了有效的解决方案。


Lasse V. Karlsen 的有用 cmets 为基础回答您的问题:

我想知道为什么我的原始字符串被转换为一个数组,假设它是-split的返回值......现在是一个字符数组吗?

-split operator通过给定的分隔符regex将字符串或字符串数​​组拆分为子字符串,将子字符串作为字符串数组(@ 987654328@)

 'foo|bar' -split '\|' # -> [string[]] ('foo', 'bar')
  • 数组作为输入,对每个元素分别进行分割操作,并将每个元素的结果数组连接起来形成一个单一的平面数组。

    'foo|bar', 'baz|quux' -split '\|' # -> [string[]] ('foo', 'bar', 'baz', 'quux')
    

其次,如果有一个好的答案,为什么字符串方法在技术上是数组上起作用?

您所看到的是以前半官方称为成员枚举soon to be officially termed成员访问枚举的功能:访问集合上的成员(属性或方法)并将其隐式应用于其每个元素的能力,结果收集在一个数组中(例如两个或更多元素)。

快速示例:

# .Trim() is called on *each element* of the input array.
PS> (' foo', 'bar ').Trim() | ForEach-Object { "[$_]" }
[foo]
[bar]

【讨论】:

    【解决方案2】:

    Lasse V. Karlsen 已经提供了关键信息以了解为什么 字符串 ($line) 在变为 split 后会转换为 string[]。在这种情况下,您最想使用的是与 regex 兼容的 -replace 运算符。

    以下面为例:

    $htmlcss = @'
    table {
      font-family: arial, sans-serif;
      border-collapse: collapse;
      width: 100%;
    }
    
    td, th {
      border: 1px solid #dddddd;
      text-align: left;
      padding: 8px;
    }
    
    tr:nth-child(even) {
      background-color: #dddddd;
    }
    
    </style>
    </head>
    <body>
    <h2>HTML Table</h2>
    <table>
      <tr>
        <th>Company</th>
        <th>Contact</th>
        <th>Country</th>
      </tr>
      <tr>
        <td>Alfreds Futterkiste</td>
        <td>Maria Anders</td>
        <td>Germany</td>
      </tr>
    </table>
    </body>
    </html>
    '@
    

    使用-replace 删除HTML 和CSS 标签,然后-split 得到string[],最后过滤数组以跳过空行:

    $htmlcss -replace '(?s)<.*?>|\{.*?\}' -split '\r?\n' |
    Where-Object { $_ -match '\S' }
    

    结果:

    table 
    td, th 
    tr:nth-child(even) 
    HTML Table
        Company
        Contact
        Country
        Alfreds Futterkiste
        Maria Anders
        Germany
    

    注意,regarding \{.*?\},要使这个 regex 起作用,您必须将它与 string多行字符串 一起使用。它不适用于 字符串数组 string[]。您还需要启用 (?s) 标志。假设您正在从一个文件中读取此内容,您可能希望使用 -Raw 开关打开 Get-Content

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-09-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-03-22
      • 2018-12-24
      • 1970-01-01
      相关资源
      最近更新 更多