正则表达式从Java中的字符串中获取记录编号?

正则表达式从Java中的字符串中获取记录编号?,java,regex,Java,Regex,我需要正则表达式从下面的字符串中提取记录编号 String extract = "Purchase Order HDL/17-04-2013/PRO_1311 is saved successfully" 输出: HDL/17-04-2013/PRO_1311 我试着用谷歌搜索,但没能得到结果。请建议。类似于: "Purchase Order ([A-Z]+/\d{2}-\d{2}-\d{4}/[A-Z]+_\d+) is saved successfully" String s = "P

我需要正则表达式从下面的字符串中提取记录编号

String extract = "Purchase Order HDL/17-04-2013/PRO_1311 is saved successfully"
输出:

HDL/17-04-2013/PRO_1311
我试着用谷歌搜索,但没能得到结果。请建议。

类似于:

"Purchase Order ([A-Z]+/\d{2}-\d{2}-\d{4}/[A-Z]+_\d+) is saved successfully"
String s = "Purchase Order HDL/17-04-2013/PRO_1311 is saved successfully";
Pattern p = Pattern.compile("(?<=Purchase Order ).+?(?= is saved successfully)");
Matcher m = p.matcher(s);
if (m.find()) {
    System.out.println(m.group());
}
这样,您将在第一个捕获组中获得所需的内容

当然,这取决于您的订单模式,您应该阅读一些关于正则表达式的内容。

试试看

String recordNumber = str.replaceAll(".*?(\\w+/\\d{2}-\\d{2}-\\d{4}/\\w+).*", "$1");

您需要使用正则表达式有什么特别的原因吗?出于性能和可读性的考虑,如果有更合适的替代方案,最好避免使用它们

在这种情况下,前缀和后缀似乎总是相同的长度,因此您可以简单地使用
String.substring
删除它们。如果订单ID的前缀始终是“采购订单”,后面是“成功保存”,则您只需在前面剪下15个字符,在后面剪下22个字符即可:

String extract = "Purchase Order HDL/17-04-2013/PRO_1311 is saved successfully";
String orderId = extract.substring(15, extract.length() - 22);
(如果您想真正了解这些神奇数字的来源,可以将它们定义为,例如,
private static final int PREFIX_LENGTH=“Purchase Order”.LENGTH();

类似于:

"Purchase Order ([A-Z]+/\d{2}-\d{2}-\d{4}/[A-Z]+_\d+) is saved successfully"
String s = "Purchase Order HDL/17-04-2013/PRO_1311 is saved successfully";
Pattern p = Pattern.compile("(?<=Purchase Order ).+?(?= is saved successfully)");
Matcher m = p.matcher(s);
if (m.find()) {
    System.out.println(m.group());
}
String s=“采购订单HDL/17-04-2013/PRO_1311保存成功”;

Pattern p=Pattern.compile(“(?@user1787641您在google.Hi上尝试了什么。感谢您的回复..问题是记录编号的位置会有所不同。有时它会显示为“采购订单保存成功:HDL/17-04-2013/PRO_1311“谢谢你的回复……很有效……如果你能解释一下,那就太好了。$1是对组#1的引用,这是expr inside()。所以它说用圆括号中匹配expr的部分替换输入字符串。