如何匹配不包括第一个数字的数字范围

时间:2011-06-23 17:42:42

标签: regex

是否有人可以帮助我创建正则表达式,该表达式将匹配不包括范围中第一个数字的数字范围。问题看起来像这样:

([1-9]) 其他一些元字符 [\1-9]

如何匹配范围内的数字,不包括\1中存储的数字?

实施例: 我想找到符合以下规则XZ0XYYXZ000X的数字,其中XYZ是1到9之间的数字(0 < x < Y < Z)。

示例2:我的文件包含许多带有一些随机数的行:

2720337
3730447个
1362874个
等。

现在,我想提取符合特定条件的这些行(例如使用grep)(例如数字27203373730447匹配条件XZX0YYZ,其中XYZ是以下关系X < Y < Z中的1到9之间的数字,0为零)。我的问题是这样的([1-9])([\1-9])\1(0)([\1-\2])\3\2,但是我找不到从范围[\1-\2]或最低[\1-9]

中省略最大值和最低值的方法

3 个答案:

答案 0 :(得分:1)

此正则表达式强制执行XYZ的唯一性:

([1-9])((?!\1)[1-9])\10((?!\1|\2)[1-9])\3\2

...但是没有办法用正则表达式强制执行它们的排序。


关于正则表达式:

([1-9])捕获组#1中的第一个数字。这是您模板中的第一个X

((?!\1)[1-9])捕获组#2中的第二个数字,但仅在负向前瞻确认它与第一个数字不同之后。这是Z值。

\1匹配第三个数字,假设它与第一个数字相同。

0很明显

((?!\1|\2)[1-9])表示Y值,因此我们必须确认它与其他两个捕获中的任何一个都不相同。它在第3组中被捕获。

\3再次匹配相同的数字;这是第二个Y

\2匹配Z值的另一个,而鲍勃是你的叔叔!

再次回到0,我忽略了一个警告。如果正则表达式中恰好有十个或更多捕获组,则\10可以被解释为对组#10的反向引用。无论是否需要,分解这类东西都是一个好主意。

许多正则表达式都提供了隔离组引用的替代符号,例如\g<1>${1}。不知道你正在使用什么样的味道,我将使用方括号来隔离零(即,将其转换为单元素字符类):

([1-9])((?!\1)[1-9])\1[0]((?!\1|\2)[1-9])\3\2

答案 1 :(得分:0)

我假设你匹配一个字符串 XY ,其中0&lt; X &lt; Y &lt; = 9.您可以轻松地将其扩展到您的需求。

不幸的是,在字符类中不能使用反向引用。 我知道的唯一方法是为 X 的每个值明确写一个案例: 1[2-9]|2[3-9]|3[4-9]|4[5-9]|5[6-9]|6[7-9]|7[89]|89

有可能(例如使用否定前瞻)确保 Y 不等于 X ,如:([1-9])(?!\1)[1-9],但这并不能确保 Y 不小于 X

答案 2 :(得分:0)

好的,让我们试一试......最后。 如果您的第二个示例意味着数字具有相同的模式,考虑到它们的相同位数属性,您至少可以使用正则表达式来首先检查:

([1-9])([1-9])(\1)0([1-9])\4\2

这将匹配2720337和3730447.

正则表达式捕获了一些部分。检查,如果$ 1&lt; $ 4和$ 4&lt; 2美元,你就完成了。如果我理解正确,那就是。