Java 使用正则表达式,是否可以使用诸如';其次是';或';前面是';

Java 使用正则表达式,是否可以使用诸如';其次是';或';前面是';,java,regex,Java,Regex,我有以下表达式,其中我要提取一个12位长的标识符: ([12]\d{3})(\d{6})(\d{2}) 如果字符串的格式为以下格式,则此选项可以正常工作: ABCD123456789101 123456789101 当它得到如下字符串时,它如何知道要匹配的12位数字: ABCD1234567894837376383439434343232 1234567894837376383439434343232 在上面的场景中,我不想选择12位数字。因此,我认为答案是只选择12位数字,如果这12位数

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

([12]\d{3})(\d{6})(\d{2})
如果字符串的格式为以下格式,则此选项可以正常工作:

ABCD123456789101
123456789101
当它得到如下字符串时,它如何知道要匹配的12位数字:

ABCD1234567894837376383439434343232
1234567894837376383439434343232
在上面的场景中,我不想选择12位数字。因此,我认为答案是只选择12位数字,如果这12位数字之前没有其他数字,或者没有其他数字。我尝试了这个改变:

[^0-9]([12]\d{3})(\d{6})(\d{2})[^0-9]
这基本上是说,只有当12位之前和之后的字符是非数字的时候,才能给我12位数字。我的问题是,我也得到了这些非数字字符作为匹配的一部分,即

ABCD123456789483X7376383439434343232 returns D123456789483X

是否有方法检查前面和后面的字符是什么,但不包括在匹配结果中?i、 e.仅当前面和后面的字符是非数字字符,但不包括匹配结果中的非数字字符时才匹配

您可以使用lookarounds:

(?<!\\d)([12]\d{3})(\d{6})(\d{2})(?!\\d)
(?
在这里:

  • (?是一个负的后向查找,这意味着您的模式前面没有数字
  • (?!\\d)
    是一个负前瞻,表示您的模式后面没有数字

您可以使用lookarounds:

(?<!\\d)([12]\d{3})(\d{6})(\d{2})(?!\\d)
(?
在这里:

  • (?是一个负的后向查找,这意味着您的模式前面没有数字
  • (?!\\d)
    是一个负前瞻,表示您的模式后面没有数字

谢谢-你介意解释一下这个表达是怎么做的吗?是的,添加了我的解释和一个非常有用的链接来理解lookarounds。谢谢,这就是我一直在寻找的。不,它现在正在挑选。regex网站不是很好。看看它在这里工作:是的,我注意到了-这是我的错误,因为我两次转义了数字-谢谢谢谢-你是不是ind解释了这个表达式的作用。是的,添加了我的解释和一个非常有用的链接来理解lookarounds。谢谢,这是我一直在寻找的。不,它现在正在挑选。regex网站不是很好。看看它在这里工作:是的,我注意到了-这是我的错误,因为我两次转义了数字-谢谢