我正在编写一个从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作为字符串,需要使用运行时不知道的类型名称(无法解析)。
答案 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)
为什么不用点(。)分割并只取最后一个字符串