【问题标题】:Regex to match a specific character?正则表达式匹配特定字符?
【发布时间】:2013-04-16 14:52:54
【问题描述】:

我需要创建一个正则表达式,当它单独时将匹配字符“N”。到目前为止,我已经想出了表达式:"^[N]$",这似乎在这个例子中有效。它与其他三个不匹配,只是“N”。

public static void Main()
{
    string[] words = new string[] { "42ND", "N", "WATERING", "ANONYMOUS"};

    string pattern = @"^[N]$";

    foreach (string word in words)
    {
        if( Regex.IsMatch(word, pattern))
        {
            Console.WriteLine(word + " Is a match"); 
        }
    }
} 

任何人都可以从中找出任何问题或提供更好的问题吗?谢谢!

为了清楚起见进行编辑: 我只是想匹配"N" 的字母,仅此而已。它不应与“NN”、“NNN”或任何变体匹配,也不应与包含字母 "N" 的任何单词匹配。

【问题讨论】:

  • 因为它是为了匹配单个“N”
  • word.IndexOf("N")>=0word.Contains("N") ?
  • 从您的问题中不清楚,您是否想要其他词匹配?还是您很高兴只有 "N" 匹配?
  • 我只需要 "N" 匹配项。
  • 这看起来像是一个大学项目,如果是的话,我会考虑完全过度设计它:添加 i18n、并行性、安全性和一些过早的优化。

标签: c# .net regex


【解决方案1】:

您可以使用\b(单词边界匹配),这样您就可以挑选出字符串中的所有“单N”单词(不确定这是否是您真正需要的,但是您在示例中拥有的字符串数组建议可能是这种情况)。

using System;
using System.Diagnostics;
using System.Text.RegularExpressions;

namespace ConsoleApplication1 {
    internal class Program {
        private static void Main(string[] args) {
            var pattern = new Regex(@"\bN\b");
            const string input = "N foo N bar N";
            MatchCollection matches = pattern.Matches(input);
            Debug.Assert(matches.Count == 3);
            foreach (Match m in matches) {
                Console.WriteLine(m.Value);
            }
        }
    }
}

【讨论】:

    【解决方案2】:

    如果您只是想找到与字符串 "N" 完全匹配的内容,则无需使用正则表达式!

    if ( word == "N" ) ...
    

    【讨论】:

    • 替代 LINQ 语法:foreach (string word in words.Where(word => word == "N")) { ... }
    【解决方案3】:

    当它只有一个字符时,你真的不需要字符类([]^N$^[N]$ 的含义相同。

    您的正则表达式匹配的是一个由单个字符组成的字符串:N

    ^ 匹配字符串的开头和$ 的结尾,两者之间唯一有效的字符是N,因此它将匹配字符串N


    更新:

    如果您所追求的只是一个由N 组成的字符串,那么您根本不需要正则表达式,正如其他人所建议的那样,使用if (word == "N") 或者如果您想获得由N 组成的任何单词使用更大的字符串,然后你会使用\bN\b

    【讨论】:

    • \bN\b 怎么样?你的只是匹配任何没有被 Ns 包围的 N - 我相信这个问题要求 Ns '自己'。当然这有点模棱两可,因为这可能意味着整个字符串是“N”,或者任何被空格包围的 N 都是必需的。
    • 我刚刚意识到这就是他所追求的,因为单词在一个数组中,想要一个匹配N 的正则表达式似乎很荒谬,因为正则表达式是N。如果在 字符串中 挑选出 N 的单词,那么 \bN\b 就可以完成这项工作。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-03
    • 2017-07-02
    • 1970-01-01
    • 2023-03-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多