java - 在正则表达式匹配方面需要帮助
问题描述
这可能非常简单,但我对正则表达式非常陌生,并且有一个要求,我需要在字符串中进行一些正则表达式匹配并提取其中的数字。下面是我的代码,带有示例 i/p 和所需的 o/p。我试图Pattern
通过参考https://www.freeformatter.com/java-regex-tester.html来构建,但我的正则表达式匹配本身返回错误。
Pattern pattern = Pattern.compile(".*/(a-b|c-d|e-f)/([0-9])+(#[0-9]?)");
String str = "foo/bar/Samsung-Galaxy/a-b/1"; // need to extract 1.
String str1 = "foo/bar/Samsung-Galaxy/c-d/1#P2";// need to extract 2.
String str2 = "foo.com/Samsung-Galaxy/9090/c-d/69"; // need to extract 69
System.out.println("result " + pattern.matcher(str).matches());
System.out.println("result " + pattern.matcher(str1).matches());
System.out.println("result " + pattern.matcher(str1).matches());
以上所有 SOP 都返回 false。我正在使用 java 8,有什么方法可以在单个语句中匹配模式,然后从字符串中提取数字。
如果有人能指出我如何调试/开发正则表达式,我会很棒。如果我的问题有什么不清楚的地方,请随时告诉我。
解决方案
您可以使用
Pattern pattern = Pattern.compile(".*/(?:a-b|c-d|e-f)/[^/]*?([0-9]+)");
查看正则表达式演示
当与 一起使用时matches()
,上述模式不需要显式锚点,^
并且$
.
细节
.*
- 除换行符以外的任何 0+ 个字符,尽可能多/
- 最右边/
的后面是后续的子模式(?:a-b|c-d|e-f)
- 一个非捕获组,匹配内部的任何备选方案:a-b
,c-d
或e-f
/
- 一个/
字符[^/]*?
- 以外的任何字符/
,尽可能少([0-9]+)
- 第 1 组:一位或多位数字。
List<String> strs = Arrays.asList("foo/bar/Samsung-Galaxy/a-b/1","foo/bar/Samsung-Galaxy/c-d/1#P2","foo.com/Samsung-Galaxy/9090/c-d/69");
Pattern pattern = Pattern.compile(".*/(?:a-b|c-d|e-f)/[^/]*?([0-9]+)");
for (String s : strs) {
Matcher m = pattern.matcher(s);
if (m.matches()) {
System.out.println(s + ": \"" + m.group(1) + "\"");
}
}
使用添加了锚的相同正则表达式的替换方法:
List<String> strs = Arrays.asList("foo/bar/Samsung-Galaxy/a-b/1","foo/bar/Samsung-Galaxy/c-d/1#P2","foo.com/Samsung-Galaxy/9090/c-d/69");
String pattern = "^.*/(?:a-b|c-d|e-f)/[^/]*?([0-9]+)$";
for (String s : strs) {
System.out.println(s + ": \"" + s.replaceFirst(pattern, "$1") + "\"");
}
查看另一个 Java 演示。
输出:
foo/bar/Samsung-Galaxy/a-b/1: "1"
foo/bar/Samsung-Galaxy/c-d/1#P2: "2"
foo.com/Samsung-Galaxy/9090/c-d/69: "69"
推荐阅读
- excel - Excel - 如何根据另一个单元格的颜色更改形状颜色
- html - 如何在Django项目中组织大量页面的分页?
- clearcase - 涉及多个元素的 ClearCase 路径名
- c++ - 在cmake中从源代码构建opencv4.4.0时出错
- flutter - 如何测试来自 admob 的真实广告
- python - TypeErr:无法腌制“_thread.RLock”对象 - 目标:以 .joblib 格式保存模型以便在需要 .joblib 后重用
- javascript - DiscordJS 验证命令
- sql - 查询 - 计算具有相同列的 2 个 DB 表之间的差异
- angular - 如何使用 IdentityServer4 身份验证以静默方式重新登录用户
- python-3.x - 如何根据模式屏蔽和替换字符串中的字符?