正则表达式匹配不以模式结尾的字符串?

时间:2012-08-09 01:32:49

标签: regex regex-negation lookahead negative-lookahead negative-lookbehind

我正在尝试形成一个正则表达式,该表达式将匹配不使用DOT FOLLOWED BY NUMBER结束的字符串。

例如

abcd1
abcdf12
abcdf124
abcd1.0
abcd1.134
abcdf12.13
abcdf124.2
abcdf124.21

我想匹配前三个。
我尝试修改this post但它对我不起作用,因为数字可能有不同的长度。

有人可以帮忙吗?

3 个答案:

答案 0 :(得分:4)

您可以使用以下内容:

^((?!\.[\d]+)[\w.])+$

它锚定在一条线的起点和终点。它基本上说:

Anchor at the start of the line
DO NOT match the pattern .NUMBERS
Take every letter, digit, etc, unless we hit the pattern above
Anchor at the end of the line

所以,这种模式匹配(没有点数,然后是数字):

This.Is.Your.PatternThis.Is.Your.Pattern2012

但是它不匹配(数字前面的点):

This.Is.Your.Pattern.2012

编辑:回应Wiseguy的评论,您可以使用:

^((?!\.[\d]+$)[\w.])+$ - 在号码后面提供一个锚点。因此,它必须是一个点,然后只有一个数字......而不是你在问题中指定的那个......

答案 1 :(得分:2)

如果您可以稍微放松一下限制,可以尝试使用此(扩展)正则表达式: ^[^.]*.?[^0-9]*$

如果您正在使用与整个字符串匹配的函数/工具,则可以省略锚定metasymbols ^$

解释:此正则表达式允许找到除dot(可选)点之外的任何符号,之后允许所有非数字符号。它不适用于格式不正确的数字,例如字符串:abcd1...3abcd1.fdfd2。对于具有多个点的某些字符串,它也无法正常工作,例如abcd.ab123cd.a(问题描述有点模糊)。

哲学解释:使用正则表达式时,通常你不需要完全按照你的任务所做的那样,等等。所以即使是简单的正则表达式也可以完成这项工作。一个抽象的例子:你有一个文件,其中的行是数字,或者是一些复杂的名字(没有数字),比如说,你想要过滤掉所有数字,然后按[^0-9]进行简单过滤 - grep '^[0-9]'做好这份工作。

但是如果您的任务更复杂并且需要验证格式并对数据做其他奇特的事情,为什么不使用简单的脚本(例如,在awkpythonperl或其他语言)?或者是一个简短的“手写”功能,如果您正在实施独立应用程序。正则表达式很酷,但它们通常不是正确使用的工具。

答案 2 :(得分:0)

我会在结尾处使用一个简单的负面后视:

.*(?<!\\.\\d+)$