用于将字符串重新格式化为安全xml标记的正则表达式
我目前正在尝试编写一个RegexReplace,以确保输入可以用作有效的XML标记,这意味着:没有空格,没有特殊字符,只有小写,等等 有没有一个共同的方法,还是我必须从头开始 例如:用于将字符串重新格式化为安全xml标记的正则表达式,xml,regex,Xml,Regex,我目前正在尝试编写一个RegexReplace,以确保输入可以用作有效的XML标记,这意味着:没有空格,没有特殊字符,只有小写,等等 有没有一个共同的方法,还是我必须从头开始 例如: string Invalid = "asd(%4 asKUd n!%mn &§a_As1"; // Invalid as a tag string Valid = FormatToSafeXmlTag(Invalid); // How to write this function? // Valid
string Invalid = "asd(%4 asKUd n!%mn &§a_As1"; // Invalid as a tag
string Valid = FormatToSafeXmlTag(Invalid); // How to write this function?
// Valid = "asd4_askud_nmna_as1"
- 仅小写:
^[a-z]+$
- 第一个字符小写,(可选)剩余字符小写/数字
^[a-z][a-z0-9]*$
- 仅大写:
^[A-Z]+$
- 第一个字符字母,(可选)剩余字符字母数字
^[a-zA-Z][a-zA-Z0-9]*$
str = str.replace(/[^a-z]/g, "");
问题是当用户只输入不可接受的字符时,您将尝试创建一个带有空字符串的xml标记。我宁愿让用户再试一次——输入小写字符串有多难
注意:另一种边缘情况是当用户输入xml
或其任何不区分大小写的变体时(感谢@Tim的回答)。如果您使用的是javascript,则无法使用Tim建议的解决方案,因为它使用了Lookback,这是javascript正则表达式不支持的功能
JavaScript代码:
str = str.replace(/\s/g, "_"); //replaces spaces
str = str.replace(/[^a-zA-Z0-9_\-]/g, "");//trim symbols
var reg = new RegExp(/^xml/i);
if(str.length == 0 || reg.test(str)) //is it empty or "xml" or "XmL" or ..
alert("invalid regex");
根据,元素的名称按以下方式形成:
Name ::= NameStartChar (NameChar)*
在哪里
NameStartChar ::= ":" | [A-Z] | "_" | [a-z] | [#xC0-#xD6] | [#xD8-#xF6]
| [#xF8-#x2FF] | [#x370-#x37D] | [#x37F-#x1FFF] | [#x200C-#x200D]
| [#x2070-#x218F] | [#x2C00-#x2FEF] | [#x3001-#xD7FF] | [#xF900-#xFDCF]
| [#xFDF0-#xFFFD] | [#x10000-#xEFFFF]
NameChar ::= NameStartChar | "-" | "." | [0-9] | #xB7
| [#x0300-#x036F] | [#x203F-#x2040]
转换为正则表达式非常简单
如果要删除此定义之外的任何字符,只需反转表达式要查找的字符即可。XML标记(我假设您询问的是标记名)必须遵循以下规则:
- 以字母、点、冒号或下划线开头
- 仅包含字母、数字、点、下划线或冒号(用于名称空间)
- 不能以
xml开头
^(?!xml)[\w.:][\w\d.:]*$
根据您的正则表达式风格(例如,.NET在\w
中包含Unicode字母,这对于标记名是合法的)。你也可以使用
^(?!xml)[p\{L}._:][\p{L}\p{N}._:]*$
如果\w
不包含Unicode字母
当然,您可以使用更严格的规则,并且可能不是所有XML解析器都可以处理完整的Unicode标记名。所以最后呢,
^(?!xml)[A-Za-z._:][A-Za-z0-9._:]*$
这可能是您最好的选择…您可以检查XML解析器是否可以读取字符串…@Welbog-这是一个比这个小得多的例子,并且regex可能工作得很好。如果我读对了这个问题,他只是在验证某个标记名是否有效。这是一个比查看某个内容是否是有效的XML小得多的问题。有效标记名的规则可能很简单,他并没有试图用正则表达式解析xml,只是试图验证用户输入以将其用作xml标记。对我来说,这听起来像是正则表达式的一个有效用例。实际上,我不想评估标记是否可以接受——我想接受它并使用它,但要格式化它,使其有效。例如,如果用户输入
asd(%4 asKUd n!%mn&§a_As1
,正则表达式应返回asd4_asKUd_nmna_As1
,作为有效标记。@Herms和Amarghosh:注意。我已删除了我的注释。单字符标记可以吗?(您的第二个和最后一个示例将只匹配具有多个字符的标记)@ApoY2k如果用户只输入无效字符怎么办?你从哪里知道它不能以“xml”开头?我认为这不在规范中。请看Welbog的回答。我在这里读到:(对不起,它是德语)如果说xml
是为standard.AFAIK的后续扩展保留的,xml
-标记是为特定于xml的标记保留的^^^^当然在xml文档的开头有“xml”标记,但是规范没有对以“xml”开头的标记进行限制。再次参见welbog发布的语法。