【问题标题】:C# regular expression to match a word either as a whole or only have special characters as prefix or suffixC#正则表达式匹配一个词作为一个整体或只有特殊字符作为前缀或后缀
【发布时间】:2021-09-18 01:35:39
【问题描述】:

我需要一个正则表达式来匹配以下条件:

NPT         - match
@@#NPT      -- match
@@#NPT*)    -- match
testNPT     -- not match
testNPTtest     -- not match
@@NPT##test     -- not match
.NPT.       -- match
.NPT.abc    -- not match

基本上,我需要匹配前缀和后缀不是字母或数字的单词(例如 NPT),但如果它是单个单词 (NPT) 或具有前缀或后缀或两者都只有特殊字符(例如 @ #NPT#$ 或 ##NPT)

我尝试了以下表达式,但没有得到想要的结果

(?<!^[a-z])(\bSM\b)(?![a-z])

【问题讨论】:

    标签: c# regex


    【解决方案1】:

    你可能会使用

    (?<![a-z])\bNPT\b(?=\W*(?!\S))
    

    模式匹配:

    • (?&lt;![a-z])
    • \bNPT\b
    • (?= 正向前瞻,断言右边是
      • \W*匹配可选的非单词字符
      • (?!\S) 在右侧声明一个空白边界
    • )关闭前瞻

    查看regex demoC# demo

    var regex = new Regex(@"(?<![a-z])\bNPT\b(?=\W*(?!\S))");
    string[] strings = {"NPT", "@@#NPT", "@@#NPT*)", "testNPT", "testNPTtest", "@@NPT##test", ".NPT.", ".NPT.abc"};
    
    foreach (String s in strings)
    {
        var m = regex.Match(s);
        if (m.Success) {
            Console.WriteLine("{0} --> {1}", s, m.Value);
        }
    }
    

    输出

    NPT --> NPT
    @@#NPT --> NPT
    @@#NPT*) --> NPT
    .NPT. --> NPT
    

    【讨论】:

    • 太棒了。也许[^\w\s]\W 相同,并且您的正则表达式可以简化为(?&lt;=^\W*)\bNPT\b(?=\W*$),此外\b 包含在\W 中,所以(?&lt;=^\W*)NPT(?=\W*$) 也应该可以工作。
    • @SebastianSchumann 这也可能是一个解决方案。这取决于允许的字符。 \W 也将匹配一个空格和一个换行符,这就是为什么我将 \s 添加到否定的变化中。
    • 嗨@TheFourthBird,上述解决方案适用于javascript,但不适用于Asp.net。请问能提供asp.net版本的正则表达式吗?
    • 是的,你是对的 \W 将匹配空格。给定的样本不包含任何空格,所以这就是我没有检查的原因。您的解决方案更容错。
    • @CunchalMaji 我添加了一些演示 C# 代码和演示链接ideone.com/pSw8x9
    猜你喜欢
    • 2020-05-19
    • 1970-01-01
    • 2013-08-26
    • 2017-12-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-13
    相关资源
    最近更新 更多