Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/354.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 正则表达式匹配某些ID_Java_Regex - Fatal编程技术网

Java 正则表达式匹配某些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

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

我需要匹配以下所有ID:

#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]]?";