正则表达式匹配某些ID

时间:2015-07-10 13:26:47

标签: java regex

我需要帮助解决一些棘手的正则表达式(对我而言!)并希望我能在将来学到一些东西来写一些。

我需要匹配以下所有ID:

#1
#12
#123
#1234
#5069
#316&
#316.
#316;

并且不希望匹配以][结尾或位于()之间的前导零和数字。

#0155
#0000155
#1123]
#1123[
(#1125)

我想出了类似这样的内容:(#[1-9]\d{0,}),但它符合上述所有内容。所以,我尝试了不同的东西,如:

"(#[1-9]\\d{0,})([\\s,<\\.:&;\\)])"
"(#[1-9]+)([\\s,<\\.])"
"(?m)(#[1-9]+)(.,\(,\))"

但我真正想做的是(#[1-9]\d{0,})匹配所有数字但不遵循[]() < / em>的

如何在正则表达式中表达这样的内容?

P.S。:正则表达式需要在Java中使用。

也许有人可以帮助解决这个问题,如果他能解释他是如何找到解决方案的话,那就更好了,所以当他们遇到同样的问题时,我可以学到新东西并帮助别人。

亲切的问候!

3 个答案:

答案 0 :(得分:3)

您可以使用以下解决方案:

#[1-9]\d*(?![\[\])])\b[&.;]?

请参阅demo

<强> REGEX

  • # - 按字面意思匹配#
  • [1-9] - 从1到9的1位数
  • \d* - 0位或以上
  • (?![\[\])]) - 否定前瞻,确保数字后面没有[])
  • \b - 字边界
  • [&.;]? - 字面上匹配?&.的可选(;)字符组。

示例代码:

String str = "#1\n#12\n#123\n#1234\n#5069\n#316&\n#316.\n#316;\nand not matches (leading zeros) and numbers that end with ] or [ or are between ().\n\n#0155\n#0000155\n#1123]\n#1123[\n(#1125)";
String rx = "#[1-9]\\d*(?![\\[\\])])\\b[&.;]?";
Pattern ptrn = Pattern.compile(rx);
Matcher m = ptrn.matcher(str);
while (m.find()) {
    System.out.println(m.group(0));
}

请参阅IDEONE demo

<强>更新

您可以通过原子分组来实现预期的结果,从而阻止正则表达式引擎回溯到它。

String rx = "#(?>[1-9]\\d*)(?![\\[\\])])[^\\w&&[^\n]]?";

简单来说,只有在匹配的最后一位数字后才会检查括号。请参阅updated demo

[^\\w&&[^\n]]?模式可选地匹配任何非字母数字字符,但是换行符。使用字符类交集技术从字符类中排除换行符。

答案 1 :(得分:2)

您可以使用积极的量词。

"#[1-9]\\d*+(?![\\[\\])])"

\\d*+贪婪地匹配所有零个或多个字符,+之后的*个字符不会让正则表达式引擎回溯。

如果您还要匹配以下非单词字符,请添加可选的\\W

"#[1-9]\\d*+(?![\\[\\])])\\W?"

DEMO

答案 2 :(得分:0)

目前我无法在Java中测试这个,但是如何

"^#[1-9][0-9]*[&.;]?$"

(任何以'#'开头的字符串,然后是1-9的字符,然后是0-9的零个或多个字符,然后是'&amp;','。'或';'或者没有,结束字符串)

编辑:这仅在每个要检查的ID都在其自己的字符串中时才有效,否则您需要其他答案中的一个示例。