使用正则表达式只获取通配符值

本文关键字:通配符 获取 正则表达式 | 更新日期: 2023-09-27 17:50:59

我想在dotnet (c#)中使用正则表达式提取通配符。

如果我使用像Book_*这样的模式(所以它匹配目录通配符),它提取与*匹配的值。

例如:

  • 对于字符串"Book_1234"和模式"Book_*"我想提取"1234"

  • 用于字符串"Book_1234_ABC"和模式"Book_*_*"我应该能够提取1234和ABC

使用正则表达式只获取通配符值

应该这样做:(DEMO)

string input = "Book_1234_ABC"; 
MatchCollection matches = Regex.Matches(input, @"_([A-Za-z0-9]*)");
foreach (Match m in matches) 
    if (m.Success)
        Console.WriteLine(m.Groups[1].Value);

实现您的方案的方法是

  1. 获取出现在通配符(*)之间的字符串列表。
  2. 用regexp分隔符(|)连接列表。
  3. 用字符串中不期望的字符替换正则表达式(我想这里应该有足够的空间)
  4. 修剪,然后将返回的字符串拆分为您在上一步中使用的char,这将返回通配符列表。

        var str = "Book_1234_ABC";
        var inputPattern = "Book_*_*";
        var patterns = inputPattern.Split('*');
        if (patterns.Last().Equals("")) 
            patterns = patterns.Take(patterns.Length - 1).ToArray();
        string expression = string.Join("|", patterns);
        var wildCards = Regex.Replace(str, expression, " ").Trim().Split(' ');
    

我首先将'*'通配符转换为等效的正则表达式,即:

*变为'w+然后我使用这个正则表达式来提取匹配。

当我使用你的输入字符串运行这段代码时:

using System;
using System.Text.RegularExpressions;
namespace SampleApplication
{
    public class Test
    {
        static Regex reg = new Regex(@"Book_([^_]+)_*(.*)");
        static void DoMatch(String value) {
            Console.WriteLine("Input: " + value);
            foreach (Match item in reg.Matches(value)) {
                for (int i = 0; i < item.Groups.Count; ++i) {
                    Console.WriteLine(String.Format("Group: {0} = {1}", i, item.Groups[i].Value));
                }
            }
            Console.WriteLine("'n");
        }
        static void Main(string[] args) {
            // For a string "Book_1234" and pattern "Book_*" I want to extract "1234"
            DoMatch("Book_1234");
            // For a string "Book_1234_ABC" and pattern "Book_*_*" I should be able to extract 1234 and ABC
            DoMatch("Book_1234_ABC");
        }
    }
}

我得到这个控制台输出:

Input: Book_1234
Group: 0 = Book_1234
Group: 1 = 1234
Group: 2 = 
Input: Book_1234_ABC
Group: 0 = Book_1234_ABC
Group: 1 = 1234
Group: 2 = ABC