如何使正则表达式不匹配空字符串?

14

我的应用程序中有一个正则表达式,它可以正常工作,但它也匹配空字符串,也就是当输入为空时不会出现任何错误。我该如何修改这个正则表达式,使其不匹配空字符串?请注意,我不想改变这个正则表达式的任何其他功能。

这是我正在使用的正则表达式:^([0-9\(\)\/\+ \-]*)$

我自己对正则表达式的制定了解不多,这就是为什么我在问。我已经搜索了答案,但找不到直接的答案。我找到的最接近的答案是这个:c#中用于匹配非空字符串的正则表达式,但那对我并没有真正的帮助..

4个回答

18
*替换为+,因为*表示"0个或多个出现次数",而+表示"至少一个出现次数"。

9
有很多种模式类型可以匹配空字符串。OP正则表达式属于“^.*$”类型,通过将“*”(表示“零个或多个”)量词替换为“+”(表示“一个或多个”),可以轻松修改它以防止匹配空字符串,如在这里的帖子中已经提到的。
还有其他匹配空字符串的模式类型,如何防止它们匹配空字符串并不总是明显的。
以下是一些具有解决方案的模式:

[^"\\]*(?:\\.[^"\\]*)* (?:[^"\\]|\\.)+

abc||def abc|def (去掉额外的|选择符)

^a*$ ^a+$ (+匹配一个或多个字符)

^(a)?(b)?(c)?$ ^(?!$)(a)?(b)?(c?)$ ((?!$)负向前瞻在字符串开头失败,如果字符串结尾在字符串开头)
              或         ^(?=.)(a)?(b)?(c?)$ ((?=.)正向前瞻要求至少一个字符,.可能匹配或不匹配换行符,具体取决于修饰符/正则表达式类型)

^$|^abc$ ^abc$ (去掉^$选择符,使正则表达式能够匹配空字符串)

^(?:abc|def)?$ ^(?:abc|def)$ (去掉?量词,使(?:abc|def)组为必选项)

为了让\b(?:north|south)?(?:east|west)?\b(匹配 north, south, east, west, northeast, northwest, southeast, southwest),单词边界必须精确:在初始单词边界后添加(?<!\w),使其仅匹配单词的开头,并在尾随单词边界后添加(?!\w),使其仅匹配单词的结尾。

\b(?:north|south)?(?:east|west)?\b \b(?<!\w)(?:north|south)?(?:east|west)?\b(?!\w)


1
你可以使用+{min, max}语法:
^[0-9\(\)\/\+ \-]{1,}$

or

^[0-9\(\)\/\+ \-]+$

顺便说一下:这是一个很好的学习正则表达式的资源(而且很有趣):http://regexone.com/


1
显然,您需要将 Replace * 替换为 +,因为 + 匹配一个或多个字符。但是在字符类内部,您不需要进行所有转义。您的正则表达式可以简化为:
^([0-9()\/+ -]+)$

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接