Java 正则表达式匹配某些ID
我需要一些棘手的正则表达式的帮助来解决(对我来说!),并希望我能学到一些东西来在将来自己写一些 我需要匹配以下所有ID:Java 正则表达式匹配某些ID,java,regex,Java,Regex,我需要一些棘手的正则表达式的帮助来解决(对我来说!),并希望我能学到一些东西来在将来自己写一些 我需要匹配以下所有ID: #1 #12 #123 #1234 #5069 #316& #316. #316; 并且不希望匹配前导零和以]或[结尾或介于()之间的数字 我想出了类似这样的方法:(#[1-9]\d{0,}),但它与上述所有内容都匹配。因此,我尝试了不同的方法,如: "(#[1-9]\\d{0,})([\\s,<\\.:&;\\)])" "(#[1-9]+)([\\s
#1
#12
#123
#1234
#5069
#316&
#316.
#316;
并且不希望匹配前导零和以]
或[
结尾或介于()
之间的数字
我想出了类似这样的方法:(#[1-9]\d{0,})
,但它与上述所有内容都匹配。因此,我尝试了不同的方法,如:
"(#[1-9]\\d{0,})([\\s,<\\.:&;\\)])"
"(#[1-9]+)([\\s,<\\.])"
"(?m)(#[1-9]+)(.,\(,\))"
”(#[1-9]\\d{0,})([\\s,你可以使用所有格量词
"#[1-9]\\d*+(?![\\[\\])])"
\\d*+
贪婪地匹配所有零个或多个字符,并且*
之后的+
exts不会让正则表达式引擎回溯
如果要同时匹配以下非单词字符,请添加可选的\\W
"#[1-9]\\d*+(?![\\[\\])])\\W?"
您可以使用以下解决方案:
#[1-9]\d*(?![\[\])])\b[&.;]?
看
正则表达式:
#
-按字面意思匹配#
[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));
}
看
更新
您可以通过原子分组来实现预期的结果,原子分组可以防止正则表达式引擎回溯到其中
String rx = "#(?>[1-9]\\d*)(?![\\[\\])])[^\\w&&[^\n]]?";
简而言之,括号检查仅在最后一位数字匹配后执行。请参阅
[^\\w&&[^\n]]?
模式可以选择匹配除换行符以外的任何非字母数字字符。使用字符类相交技术将换行符从字符类中排除。我目前无法在Java中测试这一点,但是如何
“^[1-9][0-9]*[&;]?$”
(以“#”开头的任何字符串,然后是1-9中的一个字符,然后是0-9中的零个或多个字符,然后是“&”、“.”或“;”或“无”,或结束字符串)
编辑:只有当每个要检查的id都在自己的字符串中时,这才有效,否则您需要其他答案中的一个示例。这正是我想要的!谢谢。尽管这几乎是正确的,而且因为您解释得非常详细。我投票支持这一点:)!也许它在所有上下文中都不起作用,所以占有行为确实更好r括号只在所有数字匹配后才会出现,而不仅仅是在每个数字之后。但还有另一种方法可以做到这一点:原子组。我会更新我的答案。
String rx = "#(?>[1-9]\\d*)(?![\\[\\])])[^\\w&&[^\n]]?";