簡體   English   中英

將 C# 轉換為 Powershell 和 Regex 不起作用,還是我做錯了?

[英]Converting C# to Powershell and Regex is not working or am I doing it wrong?

我正在嘗試將一個簡單的C#類函數轉換為Powershell模塊,但由於某種原因它無法正常工作。 對我來說,這感覺像是一個Powershell語法問題或怪癖

C#一個工作正常但不是PowerShell

我正在測試的字符串是ABC123 ,它在兩者中都應該是 VALID 。

C# 類庫

using System;
using System.Globalization;
using System.Text.RegularExpressions;

namespace KWLabelHelper
{
    public class KWLabelHelper
    {
        public static bool IsValidLabelId(string labelId)
        {
            if (string.IsNullOrEmpty(labelId))
                return false;
            if (!KWLabelHelper.Pattern.Matcher_New_LabelID.IsMatch(labelId) && !KWLabelHelper.Pattern.Matcher_Legacy_LabelID.IsMatch(labelId))
                return KWLabelHelper.Pattern.Matcher_New_Label_WithLabelFile.IsMatch(labelId);
            return true;
        }

        public static class Pattern
        {
            public static Regex Matcher_New_LabelID = new Regex("(^[a-zA-Z_])([a-zA-Z\\d_])*$",
                                                                    RegexOptions.IgnoreCase | RegexOptions.Compiled | RegexOptions.CultureInvariant);
            public static Regex Matcher_Legacy_LabelID = new Regex(string.Format((IFormatProvider)CultureInfo.InvariantCulture, "^{0}{1}{2}$", (object)'@', (object)"[a-zA-Z]\\w\\w", (object)"\\d+"),
                                                                    RegexOptions.IgnoreCase | RegexOptions.Compiled | RegexOptions.CultureInvariant);
            public static Regex Matcher_New_Label_WithLabelFile = new Regex("(?<AtSign>\\@)(?<LabelFileId>[a-zA-Z]\\w*):(?<LabelId>[a-zA-Z]\\w*)",
                                                                    RegexOptions.IgnoreCase | RegexOptions.Compiled | RegexOptions.CultureInvariant);
        }
    }
}

C#程序.cs

using System;

namespace KWLabelHelperConsole
{
    class Program
    {
        static void Main(string[] args)
        {
            string labelId = "ABC123"; // VALID

            if (KWLabelHelper.KWLabelHelper.IsValidLabelId(labelId))
            {
                Console.WriteLine("Label '{0}' is valid", labelId);
            }
            else
            {
                Console.WriteLine("Label '{0}' is NOT valid", labelId);
            }
            Console.ReadKey();
        }
    }
}

Powershell 版本

Clear-Host

function Get-LabelIsValid {
    [CmdletBinding()] 
    param 
    ( 
    [Parameter(Mandatory=$True, Position=0)] 
    [string]$LabelId
    )

    $RegexOptions = [System.Text.RegularExpressions.RegexOptions]::IgnoreCase -bor [System.Text.RegularExpressions.RegexOptions]::Compiled -bor [System.Text.RegularExpressions.RegexOptions]::CultureInvariant

    $Matcher_New_LabelID = New-Object System.Text.RegularExpressions.Regex('(^[a-zA-Z_])([a-zA-Z\\d_])*$', $RegexOptions)
    $Matcher_Legacy_LabelID = New-Object System.Text.RegularExpressions.Regex([System.String]::Format([System.IFormatProvider][System.Globalization.CultureInfo]::InvariantCulture, "^{0}{1}{2}$", [System.Object]'@', [System.Object]"[a-zA-Z]\\w\\w", [System.Object]"\\d+"), $RegexOptions)
    $Matcher_New_Label_WithLabelFile = New-Object System.Text.RegularExpressions.Regex("(?<AtSign>\\@)(?<LabelFileId>[a-zA-Z]\\w*):(?<LabelId>[a-zA-Z]\\w*)", $RegexOptions)

    if (!$LabelId)
    {
        return $false
    }

    if (!($Matcher_New_LabelID.IsMatch($LabelId)) -and !($Matcher_Legacy_LabelID.IsMatch($LabelId)))
    {
        return $Matcher_New_Label_WithLabelFile.IsMatch($LabelId)
    }

    return $True
}

Get-LabelIsValid -LabelId "ABC123" # Should return $True, but returns $False

通過 System.Text.RegularExpressions.Regex() 使用 Powershell 正則表達式,您不需要轉義反斜杠。

PS C:\> $RegexOptions = [System.Text.RegularExpressions.RegexOptions]::IgnoreCase -bor [System.Text.RegularExpressions.RegexOptions]::Compiled -bor [System.Text.RegularExpressions.RegexOptions]::CultureInvariant

PS C:\> $Matcher_New_LabelID = New-Object System.Text.RegularExpressions.Regex('(^[a-zA-Z_])([a-zA-Z\\d_])*$', $RegexOptions)
PS C:\> $Matcher_Legacy_LabelID = New-Object System.Text.RegularExpressions.Regex([System.String]::Format([System.IFormatProvider][System.Globalization.CultureInfo]::InvariantCulture, "^{0}{1}{2}$", [System.Object]'@', [System.Object]"[a-zA-Z]\\w\\w", [System.Object]"\\d+"), $RegexOptions)
PS C:\> $Matcher_New_Label_WithLabelFile = New-Object System.Text.RegularExpressions.Regex("(?<AtSign>\\@)(?<LabelFileId>[a-zA-Z]\\w*):(?<LabelId>[a-zA-Z]\\w*)", $RegexOptions)
PS C:\>
PS C:\> $LabelId = "ABC123"

PS C:\> $Matcher_New_LabelID.IsMatch($LabelId)
False
PS C:\> $Matcher_Legacy_LabelID.IsMatch($LabelId)
False
PS C:\> $Matcher_New_Label_WithLabelFile.IsMatch($LabelId)
False

Matcher_New_LabelID 應該返回 True:

PS C:\> $Matcher_New_LabelID = New-Object System.Text.RegularExpressions.Regex("(^[a-zA-Z_])([a-zA-Z\d_])*$", $RegexOptions)
PS C:\> $Matcher_New_LabelID.IsMatch($LabelId)
True
PS C:\> $Matcher_New_LabelID = New-Object System.Text.RegularExpressions.Regex('(^[a-zA-Z_])([a-zA-Z\d_])*$', $RegexOptions)
PS C:\> $Matcher_New_LabelID.IsMatch($LabelId)
True

最后 3 條正則表達式匹配器行

$Matcher_New_LabelID = New-Object System.Text.RegularExpressions.Regex('(^[a-zA-Z_])([a-zA-Z\d_])*$', $RegexOptions)
$Matcher_Legacy_LabelID = New-Object System.Text.RegularExpressions.Regex([System.String]::Format([System.IFormatProvider][System.Globalization.CultureInfo]::InvariantCulture, "^{0}{1}{2}$", [System.Object]'@', [System.Object]"[a-zA-Z]\w\w", [System.Object]"\d+"), $RegexOptions)
$Matcher_New_Label_WithLabelFile = New-Object System.Text.RegularExpressions.Regex("(?<AtSign>\@)(?<LabelFileId>[a-zA-Z]\w*):(?<LabelId>[a-zA-Z]\w*)", $RegexOptions)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM