我为可怕的头衔道歉......很难将整个情况概括为一句话。
首先我要说的是,因为我不是一名正则表达式专家。我已经在这里和那里使用了一些,但我只是提出了正确的方法来满足以下要求。
我正在尝试编写的正则表达式用于XML模式进行输入验证,并在Javascript中的其他地方用于相同目的。
支持两种不同的可能格式。有一个文字字符串,必须用引号括起来,还有一个十六进制值字符串,必须用大括号包围。
一些测试用例:
"this is a literal string"
< - 有效字符串,在“s”中正确包含
"this should " still be correct"
< - 有效字符串,“s允许在内(如果可能,必要时可以原谅此要求)
"{00 11 22}"
< - 字符串中的有效字符串{}允许。另一个可以在必要时予以原谅的人
I am bad output
< - 字符串无效,无"
s
"Some more problemss"you know
< - 无效的字符串,必须完全包含在"
的中
{0A 68 4F 89 AC D2}
< - {}
s中包含的有效字符串,十六进制字符
{DDFF1234}
< - 有效字符串,Hex字符串的空格被忽略
DEADBEEF
< - 无效字符串,必须包含在"
或{}
中
{0A 12 ZZ}
< - 无效的字符串,'Z'不是有效的十六进制字符
为了满足这些一般要求,我提出了以下正则表达式似乎以便运行良好。我仍然是Regex的新手,因此我可能会在这里遇到一个巨大的漏洞。:
".+"|\{([0-9]|[a-f]|[A-F]| )+\}
如果我没记错的话,XML Schema正则表达式会自动假定行的开头和结尾(分别为^
和$
)。因此,本质上,此正则表达式接受以"
开头和结尾的任何字符串,或者以{}
开头和结尾,并且仅包含有效的十六进制字符。到目前为止,这对我来说效果很好,除了我忘记了另一个(尽管不太常见,因此被遗忘)输入选项完全打破了我的正则表达式。
我犯了错误:
有效输入还应允许用户用逗号分隔有效字符串(任何类型,文字/十六进制)。这意味着单个字符串应该能够包含多个上述有效字符串,以逗号分隔。幸运的是,逗号是不文字字符串中支持的字符(虽然我看到我现有的正则表达式并不关心逗号)。
示例测试用例:
"some string",{0A F1}
< - 有效
{1122},{face},"peanut butter"
< - 有效
{0D 0A FF FE},"string",{FF FFAC19 85}
< - 有效(空格与十六进制值无关)
"Validation is allowed to break, if a comma is found not separating values",{0d 0a}
< - 无效,逗号是分隔符,但“允许中断验证”和“如果逗号...”未标记为"
的单独字符串
hi mom,"hello"
< - 无效,在"
或{}
s
我的想法是,可以使用逗号作为分隔符来检查字符串的每个“部分”以匹配与原始字符串类似的正则表达式,但我只是在正则表达式中不是那么先进而尚未提出解决方案靠我自己任何帮助将不胜感激,但最终解释的最终解决方案将是恒星。
感谢您阅读这一巨大的文字墙!
答案 0 :(得分:2)
根据http://www.regular-expressions.info/xml.html,在XSD中使用的正则表达式语言的表达力不如在Java中使用的语言,但足以表达您的任务。
现在进行施工,拿自己的正则表达式。将点替换为否定字符类[^,]
以匹配除逗号之外的所有内容,并且(为了更加清晰)将十六进制字符类合并为一个。你得到以下正则表达式:
"[^,]+"|\{[0-9a-fA-F ]+\}
如果我们将此正则表达式命名为<S>
(对于“单个字符串”),则正则表达式会匹配任意数量的<S>,
,然后是单个<S>
来验证其他功能:< / p>
(<S>,)*<S>
扩展,这产生了所需的正则表达式:
(("[^,]+"|\{[0-9a-fA-F ]+\}),)*("[^,]+"|\{[0-9a-fA-F ]+\})
答案 1 :(得分:1)
也许是
的内容(?:(?:"[^,]+?"|\{(?:[0-9]|[a-f]|[A-F]| )+?\}),)*(?:(?:"[^,]+?"|\{(?:[0-9]|[a-f]|[A-F]| )+?\}))