假设我想验证一个字符串,以确保它是一个无限期的单十进制数字整数列表,每个整数由一个逗号分隔,允许零或多个空格。
我想使用一个正则表达式来确保它是有效的。我会用这样的方法:
^\d(?:\s*,\s*\d)*$此字符串值将匹配:
"4,0 , 9 ,3, 6"此字符串值将不匹配:
"4,0 , 9 ,3, 6,"事实上,这就是我们想要的行为。但是,有比在正则表达式中重复\d更优雅的方法吗?(想象一下\d所代表的是一个更为复杂的现实生活正则表达式。)
我想先发制人地提出一些建议。我很清楚我可以做这样的事情:
我只是好奇是否有一种简化的或者更优雅的方式来编码正则表达式,比如"...and处理fencepost问题“。
发布于 2014-09-12 17:25:01
您可以匹配字符串的开头或分隔符,如下所示
(?!,)((^|\s*,\s*)\d)+$或者和非捕获组一起。
(?!,)(?:(?:^|\s*,\s*)\d)+$负面展望是确保第一个字符不是,。
它摆脱了第二个\d。但是它更优雅吗?我想这取决于你。我不认为在这种情况下是因为\d的简单性,但是如果您有一个非常复杂的表达式而不是\d,那么它可以清理正则表达式很多。
避免两次使用\d的另一种方法是这样做(我在我的示例中使用C# ):
string complexExpression = @"\d"; // Whatever your actual expression is
string regex = string.Format(@"^{0}(?:\s*,\s*{0})*$", complexExpression);这完全是人为的,其结果当然是相同的,但有人可能会说,它比100% regex解决方案更具可读性和优雅性。
https://stackoverflow.com/questions/25813545
复制相似问题