4

我正在编写一种从 System.Type.FullName(不是 XML)中删除命名空间的方法。

我开始使用谷歌搜索并没有走得太远,所以转而尝试编写可以与 Regex.Replace() 一起使用的 Regex。但我远非正则表达式艺术大师,所以我在正则表达式众神面前谦虚地展示自己。

给定以下输入:

name.space.class
name.space.class<other.name.space.class1>
name.space.class<other.name.space.class1, shortSpace.class2>

我需要删除命名空间,所以我得到:

class
class<class1>
class<class1, class2>

或者,如果有人知道具有此功能的现有库,那就更好了!

注意:我知道 System.Type 有一个命名空间属性,我可以使用它来删除命名空间(即 System.Type.FullName - System.Type.Namespace),但我的方法将类型名称作为字符串并需要使用类型运行时不知道(无法解析)的名称。

4

5 回答 5

5

这个怎么样...

[.\w]+\.(\w+)

...并替换为$1. 在regex101上查看它的实际效果。

通过查看一些 C# 示例,您似乎会这样做

string output = Regex.Replace(input, @"[.\w]+\.(\w+)", "$1");
于 2013-05-23T12:40:41.563 回答
2

尝试这个:

public static string RemoveNamespaces(string typename)
{
    return string.Join("", 
          Regex.Split(typename, 
                     @"([^\w\.])").Select(p => 
                                     p.Substring(p.LastIndexOf('.') + 1)));
}
于 2013-05-23T13:19:07.737 回答
1

听起来是使用积极前瞻的好情况:

(\w+[.+])+(?=\w+)

此模式将匹配由句点或加号分隔的任意数量的单词,除了序列中的最后一个(类型的短名称)。用空字符串替换匹配项将删除所有命名空间前缀。

于 2013-05-23T13:11:25.293 回答
1

我什至不会考虑为此使用正则表达式。命令式代码在这里非常简单,尽管它需要一些字符串:

public string RemoveNamespace(string typename)
{
    if(typename.Contains("<")
    {            
        var genericArguments = 
            typename.
                // in reality, we need a substring before 
                // first occurence of "<" and last occurence of ">"
                SubstringBetween("<", ">").
                Split(',').
                Select(string.Trim).
                Select(RemoveNamespace);

        return 
            RemoveNamespace(typename.SubstringBefore("<")) + 
                "<" + 
                string.Join(", ", genericArguments) + 
                ">";
    }
    else
    {
        return typename.Trim().SubstringAfterLastOccurenceOf(".");
    }
}
于 2013-05-23T12:45:05.237 回答
0

为什么不按点(。)分割并只取最后一个字符串

于 2013-05-23T12:42:06.647 回答