从Type.FullName中删除命名空间的正则表达式/方法 - C#

时间:2013-05-23 12:33:14

标签: c# regex

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

我开始使用谷歌搜索,并没有太远,所以切换到尝试编写我可以使用Regex.Replace()的正则表达式。但我远不是正规法师的艺术大师,所以我在正义之神的神灵面前谦卑地表达自己。

给出以下输入:

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有一个Namespace属性可以用来删除命名空间(即System.Type.FullName - System.Type.Namespace),但我的方法有一个类型name作为字符串,需要使用运行时不知道的类型名称(无法解析)。

5 个答案:

答案 0 :(得分:5)

这个怎么样......

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

...并使用$1进行替换。在regex101上查看它。

通过查看一些C#示例,您似乎可以

string output = Regex.Replace(input, @"[.\w]+\.(\w+)", "$1");

答案 1 :(得分:2)

试试这个:

public static string RemoveNamespaces(string typename)
{
    return string.Join("", 
          Regex.Split(typename, 
                     @"([^\w\.])").Select(p => 
                                     p.Substring(p.LastIndexOf('.') + 1)));
}

答案 2 :(得分:1)

我甚至不考虑使用正则表达式。这里势在必行的代码非常简单,虽然它需要一些string-fu:

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(".");
    }
}

答案 3 :(得分:1)

使用积极前瞻的声音很好:

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

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

答案 4 :(得分:0)

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