使用正则表达式只获取通配符值
本文关键字:通配符 获取 正则表达式 | 更新日期: 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);
实现您的方案的方法是
- 获取出现在通配符(*)之间的字符串列表。
- 用regexp分隔符(|)连接列表。
- 用字符串中不期望的字符替换正则表达式(我想这里应该有足够的空间)
-
修剪,然后将返回的字符串拆分为您在上一步中使用的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