如何有选择地覆盖/替换字符串中的空格,如果给定索引中不存在空格,则选择一个字符?

时间:2017-05-09 20:17:43

标签: powershell

我想有选择地合并两个字符串的内容以产生输出,如下所示:

$string1 = "a c"
$string2 = " bd"
$mergedString = "abd"

以下是我提出的实现此目的的代码段:

# First convert strings to arrays
$array1 = $string1.ToCharArray()
$array2 = $string2.ToCharArray()

$array3 = @("", "", "") # array of matching length that will contain result

# Use foreach loop to iterate through each array index
0..2 | foreach {
    if (($array1[$_] -eq " ") -and ($array2[$_] -eq " ")) {
        # rule 1: empty space if both arrays have an empty space at this index
        $array3[$_] = " "
    } elseif (($array1[$_] -eq " ") -and ($array2[$_] -ne " ")) {
        # rule 2: non-space character if only one array has a non-space character
        # at this index
        $array3[$_] = $array2[$_]
    } elseif (($array1[$_] -ne " ") -and ($array2[$_] -eq " ")) {
        $array3[$_] = $array1[$_]
    } elseif (($array1[$_] -ne " ") -and ($array2[$_] -ne " ")) {
        # rule 3: array2 character if both arrays have non-space character at
        # this index
        $array3[$_] = $array2[$_]
    }
}

完成循环后,$array3可以转换为我想要的$mergedString。我的代码产生了所需的输出。但是,我想在几对字符串上执行此操作,所以我担心这段代码(即使是一个函数)可能不是实现我的目标的最有效方法。

我觉得正则表达式可能是一个更好的选择,但我仍然试图围绕正则表达式。

2 个答案:

答案 0 :(得分:3)

由于默认为第二个数组(如果两个都是非空格),您可以将规则集简化为"从第二个数组中取出字符,除非空格":

$array1 = $string1.ToCharArray()
$array2 = $string2.ToCharArray()

$mergedCharArray = 0..($array1.Count - 1) |ForEach-Object {
    if($array2[$_] -eq ' '){
        $array1[$_]
    }
    else {
        $array2[$_]
    }
}
$mergedString = $mergedCharArray -join ''

答案 1 :(得分:1)

我会提供object个答案。

Object

因此,如果string2的当前字母不是空格,请将其添加到$ mergedCharArray,然后移动到下一个字母的循环。否则,如果string1的当前字母不是空格,则添加该字母并继续循环播放下一个字母,如果这两个字母都失败则添加空格。

将它们转换为字符数组并不是真的有意义。无论如何,引用字符串中的索引都可以获得该字符,因此我跳过了该步骤。