大写字符串中的特定单词 - Powershell

时间:2015-07-27 02:18:25

标签: powershell

我需要能够在任何情况下取一个句子并将其转换为第一个单词和每个单词大写,除了以下单词:to,a,the,at,in,of,with,and,but,或

例子:“你好,你好吗”需要的结果:你好,你好Dan“

现在我知道这看起来像是家庭作业,但我需要通过看到正确的脚本用法来学习。我已经付出了很多努力来弄清楚如何做到这一点,但我需要有人通过向我展示正确的方法来缩小差距...然后我可以复习并从中学习。

3 个答案:

答案 0 :(得分:4)

Windos的回答很明显,但我很无聊,所以这是一个完全有效的实现:

function Get-CustomTitleCase {
    param(
        [string]$InputString
    )

    $NoCapitalization = @(
        'are',
        'to',
        'a',
        'the',
        'at',
        'in',
        'of',
        'with',
        'and',
        'but',
        'or')

    ( $InputString -split " " |ForEach-Object {
        if($_ -notin $NoCapitalization){
            "$([char]::ToUpper($_[0]))$($_.Substring(1))"
        } else { $_ }
    }) -join " "
}

像这样使用:

PS C:\> Get-CustomTitleCase "hello, how are you dan"
Hello, How are You Dan

答案 1 :(得分:3)

{
    "blabla": [
        "1": {
            "foo": "foo1",
            "bar": "bar1"
        },
        "22": {
            "foo": "foo22",
            "bar": "bar22"
        }
    ]
}

正则表达式解释:

 $string = 'hello how are you dan to, a, the, at, in, of, with, and, but, or'
[Regex]::Replace($string, '\b(?!(are|to|a|the|at|in|of|with|and|but|or)\b)\w', { param($letter) $letter.Value.ToUpper() })

Negative Lookahead

Regex101 Link

答案 2 :(得分:2)

我不会给你一个完整的脚本,但我可以伪代码,希望能让你走上正轨。

首先,创建一个包含您不想大写的所有单词的字符串数组。

用空格分割输入字符串('hello how are you dan')。你应该得到一个类似于'hello', 'how', 'are'...

的数组

循环分割字符串,查看该字是否是 您创建的第一个数组。

如果是,请忽略它,但如果您不想使用第一个字母并使用字符串方法来确保它在上部案例表单中

然后你需要重新加入字符串(不要忘记空格。)你可以重新构建准备输出的字符串,因为你在循环数组中循环或在结束时。

(强调增加暗示您将要追踪的某些关键词。)