首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在正则表达式中,处理分隔列表中的fencepost问题的优雅方法是什么?

在正则表达式中,处理分隔列表中的fencepost问题的优雅方法是什么?
EN

Stack Overflow用户
提问于 2014-09-12 17:18:08
回答 1查看 184关注 0票数 2

假设我想验证一个字符串,以确保它是一个无限期的单十进制数字整数列表,每个整数由一个逗号分隔,允许零或多个空格。

我想使用一个正则表达式来确保它是有效的。我会用这样的方法:

代码语言:javascript
复制
^\d(?:\s*,\s*\d)*$

此字符串值将匹配:

代码语言:javascript
复制
"4,0 , 9  ,3, 6"

此字符串值将不匹配:

代码语言:javascript
复制
"4,0 , 9  ,3, 6,"

事实上,这就是我们想要的行为。但是,有比在正则表达式中重复\d更优雅的方法吗?(想象一下\d所代表的是一个更为复杂的现实生活正则表达式。)

我想先发制人地提出一些建议。我很清楚我可以做这样的事情:

  • 使用拆分函数,修剪空格,并根据以下内容验证每个元素: ^d$
  • 在字符串末尾添加一个逗号,并对其进行验证: ^(?:\d*,\s*)+$
  • 去掉逗号和空格,并针对: ^\d+$

我只是好奇是否有一种简化的或者更优雅的方式来编码正则表达式,比如"...and处理fencepost问题“。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-09-12 17:25:01

您可以匹配字符串的开头或分隔符,如下所示

代码语言:javascript
复制
(?!,)((^|\s*,\s*)\d)+$

或者和非捕获组一起。

代码语言:javascript
复制
(?!,)(?:(?:^|\s*,\s*)\d)+$

负面展望是确保第一个字符不是,

它摆脱了第二个\d。但是它更优雅吗?我想这取决于你。我不认为在这种情况下是因为\d的简单性,但是如果您有一个非常复杂的表达式而不是\d,那么它可以清理正则表达式很多。

避免两次使用\d的另一种方法是这样做(我在我的示例中使用C# ):

代码语言:javascript
复制
string complexExpression = @"\d"; // Whatever your actual expression is
string regex = string.Format(@"^{0}(?:\s*,\s*{0})*$", complexExpression);

这完全是人为的,其结果当然是相同的,但有人可能会说,它比100% regex解决方案更具可读性和优雅性。

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

https://stackoverflow.com/questions/25813545

复制
相关文章

相似问题

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