如何检查字符串是否是WPF中FrameworkElement的有效名称?

3
在我的代码中,我正在将一个字符串分配给FrameworkElement的name属性。这个字符串是从应用程序的另一部分自动生成的,表示Java源代码中的方法名称,因此我想检查它是否包含有效的名称。
目前,我是这样做的:
        private string getValidName(String s)
        {
            return s.Replace("<", "").Replace(">", "").Replace("#", "").Replace("(", "").Replace(")", "").Replace(",", "").Replace(".", "").Replace("$", "").Replace(" ", "");
        }

但问题在于我不知道哪些字母需要替换。例如,在这段代码中,当我遇到异常时,发现缺少了[和]。

所以我的问题是,是否有允许使用的符号列表?如果有,如何以合理的方式实现?


http://www.janeg.ca/scjp/lang/identifiers.html - Daniel Hilgarth
@Daniel Hilgarth 我不确定这是否真的能帮到我,因为例如在Java中$似乎是有效的字符,但我不能将其用于WPF中FrameworkElement的name属性。 - anon
1
在我看来,最实用的方法是用下划线替换任何不是[a-z][A-Z][0-9]的字符,并在前面加上一个下划线。这样,您可以将任何任意字符串更改为有效的标识符。 - Daniel Hilgarth
@Daniel Hilgarth 嗯,是的,那应该是最简单的方法。所以我认为实现这个最简单的方法是使用正则表达式? - anon
是的,我认为正则表达式会比较合适。 - Daniel Hilgarth
显示剩余2条评论
2个回答

6

在我看来,最实用的方法是将任何不是 [a-z][A-Z][0-9] 的字符都替换为下划线,并在前面加上一个下划线。这样,您可以将任何任意字符串更改为有效的标识符。
我知道这并没有完全回答你的问题,但我认为还是值得思考的。

您可以使用以下代码实现此操作:

var result = "_" + Regex.Replace(input, @"[^a-zA-Z0-9]", "_");

谢谢,这看起来不错。我不太擅长正则表达式,你知道这样的正则表达式应该是什么样子的吗? - RoflcoptrException
@Roflcoptr:var result = "_" + Regex.Replace(input, @"[^[0-9a-zA-Z]]*", "_"); - Daniel Hilgarth
1
@Roflcoptr:等一下。这并不像它应该的那样完美地工作。它不会替换a8.923()/&%.As[d]中的开方括号。我需要检查一下,不太确定为什么会发生这种情况。 - Daniel Hilgarth

4
为了避免潜在的重复,我建议将每个无效字符的出现替换为某个独特的东西,例如其在UTF-8编码中的十六进制表示。
Regex.Replace( s, @"[^a-zA-Z0-9]",
               m => {
                      var bytes = Encoding.UTF8.GetBytes( m.Value );
                      var hexs = bytes.Select( b => string.Format( "_{0:x2}", b ) );
                      return String.Concat( hexs );
                     } );

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接