捕获组中的可选子字符串

时间:2012-10-27 16:50:30

标签: java regex

我有一个正则表达式,正确捕获斜杠后跟一个字符串中的数字。正则表达式的捕获组部分如下所示:

\(\d)+\\??

(斜线上的​​一些数字,但不包括问号),此捕获组之前和之后的正则表达式还有更多。现在我想在我的捕获组中包含一个可选的特定前缀(称为“abc _”):

  • 整个前缀(全部四个字符)必须包含在捕获的组中
  • 如果不存在前缀,则仍然捕获捕获组的数字部分
  • 如果前缀部分存在或者其他一些前缀,那么该字符串与正则表达式不匹配。

一些例子:

abc_12345  is captured
12345      is captured
ab_12345   fails to match the regex
abc_       fails to match the regex
abcd_      fails to match the regex

我如何构建它?

2 个答案:

答案 0 :(得分:3)

如果我理解正确,你想要这个:

((?:abc_)?\\d+)[?]?

?:运算符将组转换为非捕获组。我不明白部分前缀的部分。如果您允许正则表达式前面的任何内容,则不能拒绝某个可选前缀。你需要在模式前面有一个清晰的分隔符,就像一个空白区域,以便拒绝前缀。

答案 1 :(得分:2)

您的正则表达式似乎对您已描述的情况不起作用。它只捕获一位数而不是全数。你的逃避也是不一致的。

然而,这应该做你想做的事情:

((?:abc_)?\\d+)\\??

如果您使用正则表达式的前一部分,则只能回答您的上一个要求,即不应匹配不同的前缀。 (例如,如果此捕获组前面有\w+,则任何前缀都匹配,但只捕获完整且正确的前缀)