你能用正则表达式来分割你不想要的元素吗?

时间:2015-12-08 19:46:33

标签: .net regex powershell string-split

我真的希望我能很清楚地说清楚这一点,并且我没有任何运气可以用Google搜索。基本上我有一串电子邮件地址,我将这样表达:

$string = "test@me.com,test2@me2.com;test3@me3.com:test4@me4.com;;::test5@me.com"

我知道我可以像这样分开:

[system.collections.arraylist]$array  = $string.Split(":;,,")
$array.Remove("")

以上工作很好,但在这里我必须明确定义分隔符是什么。我有一个正则表达式,然后用来验证电子邮件的结构让我思考。

是否可以通过字符串中的 isn' 来定义拆分?我如何通过与我的正则表达式匹配来验证电子邮件来表达分裂?

3 个答案:

答案 0 :(得分:2)

您可以在没有正则表达式的情况下执行此操作。

Split()方法有an overload,其中包含[char]StringSplitOptions数组 - 您可以使用此方法在{{1 },,;,然后删除所有空条目:

:

这将返回一个字符串数组,其中包含您感兴趣的5个电子邮件地址

答案 1 :(得分:2)

有趣的问题!我想出了这个功能:

function Split-MeNot {
[CmdletBinding()]
param(
    [Parameter(
        Mandatory=$true,
        ValueFromPipeline=$true
    )]
    [String]
    $String ,

    [Parameter(Mandatory=$true)]
    [Regex]
    $Pattern
)

    Process {
        $anti = New-Object System.Text.StringBuilder($String)
        $Pattern.Matches($String) | Sort-Object Index -Descending | ForEach-Object {
            $null = $anti.Remove($_.Index, $_.Length)
        }
        $String.Split($anti.ToString(), [System.StringSplitOptions]::RemoveEmptyEntries)
    }
}

击穿

  1. 根据原始字符串创建新的[StringBuilder]对象。
  2. 找到与正则表达式相关的所有匹配项。
  3. 对它们进行排序,以便我们按照它们在字符串中出现的位置的相反顺序处理它们(因为我们要按索引删除)。
  4. 对于每个匹配项,请按索引和长度删除它。
  5. 根据剩下的内容拆分字符串(并移除容器)。
  6. 我测试了以下内容:

    $str = "test@me.com,test2@me2.com;test3@me3.com:test4@me4.com;;::test5@me.com"
    $pat = '[a-zA-Z0-9]+@[a-zA-Z0-9]+\.[a-zA-Z0-9]+'
    
    $str | Split-MeNot -Pattern $pat
    

    我还没有做过比这更广泛的测试,但似乎运作良好。

答案 2 :(得分:0)

只需使用powershell的-split它就可以分割多个角色实例。如果你使你的正则表达式查找任何无效的电子邮件字符的倍数,那么你可以用一个命令进行拆分,如下所示:

$string -split '[^a-zA-Z0-9._%+@-]+'