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

4
我将尝试创建一个正则表达式,以匹配不以点和数字结尾的字符串。

例如:

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

我想匹配前三个字符。
我尝试修改这篇帖子,但由于数字长度可能会变化,所以对我没有用。

有人能帮忙吗?

3个回答

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.Pattern 或者 This.Is.Your.Pattern2012

但是它不会匹配这种情况(数字前有点):

This.Is.Your.Pattern.2012

编辑: 为了回应Wiseguy的评论,你可以使用这个:

^((?!\.[\d]+$)[\w.])+$ - 这提供了一个锚点在数字之后。因此,它必须是一个点,然后只有一个数字在结尾…虽然你没有在问题中指定..


不匹配 abcdf12.12abc - Wiseguy
已更新我的答案以适应此要求。 - Simon Whitehead
1
谢谢。顺便说一句,你可能可以稍微简化一下:^((?!\.\d+$).)+$ - Wiseguy
谢谢。我在想,如果解决方案没有锚点符号是否可能,或者由于问题的某些固有结构而不可能? - Vinay
@Vinay 为什么你需要避免锚点?并且,是避免 任何 锚点,还是只避免 $ (也就是说,你仍然可以使用单词边界 \b 或其他东西吗)? - Wiseguy

2
如果您可以稍微放松一下限制,可以尝试使用这个(扩展的)正则表达式:^[^.]*.?[^0-9]*$
如果您正在使用匹配整个字符串的函数/工具,则可以省略锚定元字符^和$。
解释:该正则表达式允许除点号之外的任何符号,直到找到(可选的)点号为止,之后允许所有非数字符号。它不适用于格式不正确的数字,例如在字符串中:abcd1...3abcd1.fdfd2。对于一些带有多个点的字符串,如abcd.ab123cd.a(问题描述有点模糊),它也无法正确工作。
哲学解释:在使用正则表达式时,通常您不需要完全按照任务所需的方式进行操作等。因此,即使是简单的正则表达式也可以完成任务。一个抽象的例子:您有一个包含数字或一些复杂名称(没有数字)的行的文件,并且您想要过滤掉所有数字,那么通过[^0-9]进行简单过滤- grep '^[0-9]'就可以完成任务。
但是,如果您的任务更复杂,需要验证格式并在数据上执行其他花哨的操作,为什么不使用一个简单的脚本(例如,在awkpythonperl或其他语言中)?或者,如果您正在实现独立应用程序,则使用一个简短的“手写”函数。正则表达式很酷,但它们通常不是正确的工具。

谢谢您的回答。您能解释一下我如何避免使用锚点符号吗? - Vinay

-1
我会使用一个简单的负向后行断言,锚定在结尾处:
.*(?<!\\.\\d+)$

1
几乎没有正则表达式引擎支持可变长度的反向预查。似乎提问者可能尝试了这个方法,但由于长度不定而无法使用。 - Wiseguy

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