我正在尝试开发一个内部标记语言的代码验证系统,但由于我缺乏使用正则表达式的经验,我遇到了一些问题。该语言中的标记遵循以下格式:
{ tag : number : phrase 1| phrase 2...| phrase n}
其中number是范围(3.0,3.5,4.0...8.5)中的一个数字,其中一个短语的末尾必须有一个星号,并且必须至少有两个短语。请注意,标签不区分大小写,空格无关紧要。
我使用的正则表达式是:
\{ ?(mw) ?: ?[3-8]{1}(.0|.5)? ?((((\| ?(\w ?)+[\p{P}]? ?)*)+((\| ?(\w\ ?)+[\p{P}]?)* ?\* ?)+((\| ?(\w ?)+[\p{P}]? ?)*)?)|(((\| ?(\w ?)+[\p{P}]? ?)*)?((\| ?(\w ?)+[\p{P}]?)* ?\* ?)+((\| ?(\w ?)+[\p{P}]? ?)*)+))( ?\})这与正确的大小写匹配:
{ mw : 3.5 | phrase 1 | phrase 2* | phrase 3}但也有错误的情况:
{ mw : 3.5 | phrase 1* | phrase 2* | phrase 3} [Two asterisks]和
{ mw : 3.5* | phrase 1 | phrase 2* | phrase 3} [An asterisk with the number value]谢谢你的帮助。
如果有人想对数据验证系统通常是如何工作的提供任何见解,我将不胜感激。
发布于 2012-07-09 22:39:35
这里:
\{\s*(\w+)\s*:\s*([3-8]\.[05])\s*(\|[^|*\n]*)*(\|[^|*\n]*\*\s*)(\|[^|*\n]*)*\}下面是a demo,使用以下输入进行了测试:
{ mw : 3.5 | hello, world | says | i }
{ mw : 3.5 | hello,* world | says | i }
{ mw : 3.5 | hello, world* | says | i }
{ mw : 3.5 | hello, world | says* | i }
{ mw : 3.5 | hello, world | says | i* }
{ mw : 3.5 }
{ mw : 3.5 | }
{ mw : 3.5* | }
{ mw : 3.5 | hello, world }
{ mw : 3.5 | hello, world* }更新
一些笔记。
?表示"0或1个空格字符“。你可能指的是\s*,意思是"0个或更多的空格characters".(.0|.5)实际上匹配A0,并且B5.[\p{P}]?.更新2
我非常怀疑您是否能够添加标志,但是x标志会大大缩短这个正则表达式:
\{(\w+):([3-8]\.[05])(\|[^|*\n]*)*(\|[^|*\n]*\*)(\|[^|*\n]*)*\}发布于 2012-07-09 22:29:28
这里看起来很适合使用正确的语法,并使用诸如yacc、antlr...ect之类的解析工具来构建实际为您执行解析的代码。正则表达式只能做这么多,但看起来可能存在对DSL的不精确定义。
否则,您将需要使用多个正则表达式来验证使用单个表达式无法找到的特殊情况。
https://stackoverflow.com/questions/11397060
复制相似问题