使用Regex,是否可以使用诸如“Followed by”或“Preceded by”之类的表达式

时间:2014-02-02 16:12:10

标签: java regex

我有以下表达式,我想提取一个12位长的标识符:

([12]\d{3})(\d{6})(\d{2})

如果字符串采用以下格式,则可以正常工作:

ABCD123456789101
123456789101

当它获得如下字符串时,它如何知道要匹配的12个数字:

ABCD1234567894837376383439434343232
1234567894837376383439434343232

在上面的场景中,我不想选择十二位数字。所以答案我认为只选择十二位数字,如果这12位数字不在其他数字之前或之前。我尝试了这个改变:

[^0-9]([12]\d{3})(\d{6})(\d{2})[^0-9]

这基本上说只有当12位数之前和之后的字符都是非数字时才能得到12位数字。我遇到的问题是我也将这些非数字字符作为匹配的一部分,即

ABCD123456789483X7376383439434343232 returns D123456789483X

无论如何检查前面和前面的字符是什么但不包括在匹配结果中?即,如果前面和前面的字符是非数字但在匹配结果中不包括那些非数字字符,则仅匹配。

1 个答案:

答案 0 :(得分:4)

您可以使用外观:

(?<!\\d)([12]\d{3})(\d{6})(\d{2})(?!\\d)

下面:

  • (?<!\\d)是一个负面的背后隐藏,这意味着你的模式前面没有数字
  • (?!\\d)是一个负向前瞻,这意味着您的模式后面没有数字

Read more about lookarounds