-4

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

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

输出:

HDL/17-04-2013/PRO_1311

我尝试谷歌搜索,但无法得到结果。请建议。

4

4 回答 4

0

就像是:

"Purchase Order ([A-Z]+/\d{2}-\d{2}-\d{4}/[A-Z]+_\d+) is saved successfully"

这样,您将在第一个捕获组中获得所需的内容。

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

于 2013-04-17T10:31:29.933 回答
0

尝试

String recordNumber = str.replaceAll(".*?(\\w+/\\d{2}-\\d{2}-\\d{4}/\\w+).*", "$1");
于 2013-04-17T10:36:50.643 回答
0

您需要使用正则表达式是否有特殊原因?出于性能和可读性的原因,如果有更合适的替代方案,最好避免使用它们。

在这种情况下,前缀和后缀似乎总是相同的长度,因此您可以简单地使用String.substring来删除它们。如果订单 ID 始终以 为前缀"Purchase Order ",后跟" is saved successfully",那么您可以只修剪前面的 15 个字符和后面的 22 个字符:

String extract = "Purchase Order HDL/17-04-2013/PRO_1311 is saved successfully";
String orderId = extract.substring(15, extract.length() - 22);

(如果您想真正清楚这些神奇数字的来源,您可以将它们定义为 eg private static final int PREFIX_LENGTH = "Purchase Order ".length();

于 2013-04-17T10:37:35.723 回答
0

就像是:

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());
}

这是一个匹配两个短语中间的任何内容的正则表达式。第一个括号是后面的字符串,第二个是前面的字符串。

于 2013-04-17T10:45:18.223 回答