【问题标题】:Simple regex match question简单的正则表达式匹配问题
【发布时间】:2010-09-16 20:11:50
【问题描述】:

我有以下字符串“sometextsometextSiteId-111-aaaaasometext”

如果字符串包含“SiteId-111-aaaaa”,我想获得 111-aaaaa 部分。 (任何数字,任何字符)

"sometextsometextSiteId-111-aaaaasometext"  -> 111-aaaaa
"sometextsometextSiteId-123-abcdesometext"  -> 123-abcde
"sometextsometextsitId-111-aaaaasometext" -> (nothing)
"SiteId-999-QWERTPOIPOI" -> "999-QWERR"

我想这应该可以吗?

有什么提示吗?

谢谢拉尔西

【问题讨论】:

    标签: c# regex


    【解决方案1】:
    (?<=SiteId-)([0-9]+-[a-zA-Z]{5})
    

    应该捕捉那部分。

    PowerShell 测试:

    $re = '(?<=SiteId-)([0-9]+-[a-zA-Z]{5})'
    
    'sometextsometextSiteId-111-aaaaasometext',
    "sometextsometextSiteId-123-abcdesometext",
    "sometextsometextsitId-111-aaaaasometext",
    "SiteId-999-QWERTPOIPOI" |
    % {
        $x = [regex]::Matches($_, $re)
        Write-Host $_ - $x
    }
    

    产量

    sometextsometextSiteId-111-aaaaasometext - 111-aaaaa
    sometextsometextSiteId-123-abcdesometext - 123-abcde
    sometextsometextsitId-111-aaaaasometext - 
    SiteId-999-QWERTPOIPOI - 999-QWERT
    

    【讨论】:

    • 旁注:“任何数字,任何字符”是对我来说意味着任何 Unicode 字符的要求。此外,您对字段的长度也不是很明确。相应地进行调整。
    • 嗯,是的,在指定时有点不清楚,但这只是次要的。非常感谢您的快速帮助。也很高兴看到 powershell 测试。 :-)
    • Larsi:对于这类事情,我经常使用 PowerShell 来快速测试它们并演示它是如何工作的——或者是否完全可以。此外,由于 PowerShell 是基于 .NET 构建的,因此结果通常与您在 C# 中获得的结果一致。
    【解决方案2】:

    SiteId-(\d{3}-\D+) 这应该捕捉到这一点。

    您也可以使用rubular 来尝试您的正则表达式,它在底部有一个快速的正则表达式参考。

    【讨论】:

    • 不,不会。它会抓取“111-aaaaasometext”而不是“111-aaaaa”
    • 你说得对,我误解了这个问题。 “任何数字,任何字符”让我感到困惑:)
    • 嗯,五字规则确实是相当不成文的。是的,我也不确定\D\w 是否正确。