3

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

例如。

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

我想匹配前三个。
我尝试修改这篇文章,但它对我不起作用,因为数字可能有可变长度。

有人可以帮忙吗?

4

3 回答 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.])+$- 在数字之后提供一个锚点。因此,它必须是一个点,然后只有一个数字......不是你在问题中指定的......

于 2012-08-09T02:06:11.903 回答
2

如果你可以稍微放宽你的限制,你可以尝试使用这个(扩展的)正则表达式: ^[^.]*.?[^0-9]*$

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

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

哲学解释:当使用正则表达式时,通常你不需要完全按照你的任务似乎是什么,等等。所以即使是简单的正则表达式也可以完成这项工作。一个抽象的例子:你有一个文件,其中行要么是数字,要么是一些复杂的名称(没有数字),并且说,你想过滤掉所有的数字,然后简单的过滤[^0-9]-grep '^[0-9]'就可以了。

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

于 2012-08-09T02:07:30.460 回答
-1

我会在最后使用一个简单的负面回顾:

.*(?<!\\.\\d+)$
于 2012-08-09T02:41:56.350 回答