我需要帮助解决一些棘手的正则表达式(对我而言!)并希望我能在将来学到一些东西来写一些。
我需要匹配以下所有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中使用。
也许有人可以帮助解决这个问题,如果他能解释他是如何找到解决方案的话,那就更好了,所以当他们遇到同样的问题时,我可以学到新东西并帮助别人。
亲切的问候!答案 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?"
答案 2 :(得分:0)
目前我无法在Java中测试这个,但是如何
"^#[1-9][0-9]*[&.;]?$"
(任何以'#'开头的字符串,然后是1-9的字符,然后是0-9的零个或多个字符,然后是'&amp;','。'或';'或者没有,结束字符串)
编辑:这仅在每个要检查的ID都在其自己的字符串中时才有效,否则您需要其他答案中的一个示例。