Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 用于从Type.FullName-C中删除命名空间的Regex/Method#_C#_Regex - Fatal编程技术网

C# 用于从Type.FullName-C中删除命名空间的Regex/Method#

C# 用于从Type.FullName-C中删除命名空间的Regex/Method#,c#,regex,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,

我正在编写一个从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>
name.space.class
name.space.class
name.space.class
我需要删除名称空间,以便获得:

class
class<class1>
class<class1, class2>
类
班
班
或者,如果有人知道现有的库具有此功能,那就更好了

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

这如何

[.\w]+\.(\w+)
…并用
替换$1
。看看它在行动上

从一些C#示例来看,您似乎会这样做

string output = Regex.Replace(input, @"[.\w]+\.(\w+)", "$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(".");
    }
}
公共字符串RemoveNamespace(字符串类型名)
{

if(typename.Contains)(听起来是使用正向前瞻的好情况:

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

尝试以下操作:

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

这看起来很有希望!请给我一秒钟时间将其投入测试。我如何使用C#Regex类添加“子字符串”?对不起,我真的不明白您的意思…?您想添加子字符串的位置和原因?从一些C#示例来看,您似乎会执行
字符串输出=Regex.Replace(输入,@“[.\w]+\(\w+),“$1”)很抱歉,我的意思是替换,但我明白了:
newregex(@“[.\w]+\(\w+)).Replace(“name.space.class”,“$1”);
我曾经尝试过这种方法,不幸的是当我有一个泛型(即n.s.c我将以.c2>而不是csplit by<结束,你将得到2个字符串,A和B,你按点分割A,最后一个字符串称为A1。在之后分割B,然后按点分割结果字符串,再次只得到最后一个字符串,结果是B1,…Bn,结果是A1+”"如果发生这种情况怎么办?
Ns.Class
?结果应该是Class。--好问题!关于
Ns1.Class
?您对
Class
的预期结果显然是不正确的。名称空间很重要。嵌套类
Class1.NestedClass
!!@allonguralnek我同意名称空间很重要,但在这种情况下,我需要d要将它们全部删除,我不关心泛型类型参数是否位于不同的命名空间中。很好,但不会在所有情况下都起作用(嵌套泛型参数)…然后拆分所有子字符串(其中可能包含其他“”中的其他嵌套参数),因此
class
会导致:
substring[0]=”类