首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >我的正则表达式匹配用例有问题,我不希望它这样(数据验证)

我的正则表达式匹配用例有问题,我不希望它这样(数据验证)
EN

Stack Overflow用户
提问于 2012-07-09 22:25:46
回答 2查看 74关注 0票数 2

我正在尝试开发一个内部标记语言的代码验证系统,但由于我缺乏使用正则表达式的经验,我遇到了一些问题。该语言中的标记遵循以下格式:

{ tag : number : phrase 1| phrase 2...| phrase n}

其中number是范围(3.0,3.5,4.0...8.5)中的一个数字,其中一个短语的末尾必须有一个星号,并且必须至少有两个短语。请注意,标签不区分大小写,空格无关紧要。

我使用的正则表达式是:

代码语言:javascript
复制
\{ ?(mw) ?: ?[3-8]{1}(.0|.5)? ?((((\| ?(\w ?)+[\p{P}]? ?)*)+((\| ?(\w\ ?)+[\p{P}]?)* ?\* ?)+((\| ?(\w ?)+[\p{P}]? ?)*)?)|(((\| ?(\w ?)+[\p{P}]? ?)*)?((\| ?(\w ?)+[\p{P}]?)* ?\* ?)+((\| ?(\w ?)+[\p{P}]? ?)*)+))( ?\})

这与正确的大小写匹配:

代码语言:javascript
复制
{ mw : 3.5 | phrase 1 | phrase 2* | phrase 3}

但也有错误的情况:

代码语言:javascript
复制
{ mw : 3.5 | phrase 1* | phrase 2* | phrase 3} [Two asterisks]

代码语言:javascript
复制
{ mw : 3.5* | phrase 1 | phrase 2* | phrase 3} [An asterisk with the number value]

谢谢你的帮助。

如果有人想对数据验证系统通常是如何工作的提供任何见解,我将不胜感激。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-07-09 22:39:35

这里:

代码语言:javascript
复制
\{\s*(\w+)\s*:\s*([3-8]\.[05])\s*(\|[^|*\n]*)*(\|[^|*\n]*\*\s*)(\|[^|*\n]*)*\}

下面是a demo,使用以下输入进行了测试:

代码语言:javascript
复制
{ 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* }

更新

一些笔记。

  1. 在您最初的正则表达式中,?表示"0或1个空格字符“。你可能指的是\s*,意思是"0个或更多的空格characters".
  2. In你的原始正则表达式,请注意,(.0|.5)实际上匹配A0,并且B5.
  3. You可能需要修改我的正则表达式来重新组织你使用[\p{P}]?.
  4. It做的任何事情看起来你是在正确的轨道上,但你可能已经把一些事情弄得过于复杂了,很可能是你的空格表达式中的一些新奇的东西搞乱了你的正则表达式。我鼓励使用上面链接的工具regexpal.com,逐段测试您的正则表达式,看看哪里没有按预期工作。

更新2

我非常怀疑您是否能够添加标志,但是x标志会大大缩短这个正则表达式:

代码语言:javascript
复制
\{(\w+):([3-8]\.[05])(\|[^|*\n]*)*(\|[^|*\n]*\*)(\|[^|*\n]*)*\}
票数 0
EN

Stack Overflow用户

发布于 2012-07-09 22:29:28

这里看起来很适合使用正确的语法,并使用诸如yacc、antlr...ect之类的解析工具来构建实际为您执行解析的代码。正则表达式只能做这么多,但看起来可能存在对DSL的不精确定义。

否则,您将需要使用多个正则表达式来验证使用单个表达式无法找到的特殊情况。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11397060

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档