正则表达式 - 使用正则表达式搜索字符串并从原始字符串中提取匹配项

时间:2014-02-09 17:32:26

标签: java regex string pattern-matching

假设我有以下字符串。

Lorem ipsum XYZ1234-123456-12 lorem ipsum

我想搜索字符串中是否出现具有模式XXXDDDDDDDDDDDD的字符串(即3个字符后跟12个数字,忽略任何非字母数字字符)

要做到这一点,我会做这样的事情

String incomingId = "Lorem ipsum XYZ1234-123456-12 lorem ipsum"

private final static Pattern NONCHARACTER = Pattern.compile("[^a-zA-Z0-9]");
String removedNonChars = NONCHARACTER.matcher(incomingId ).replaceAll("")      //returns LoremipsumXYZ123412345612loremipsum

然后我运行另一个正则表达式来搜索我想要的序列(即XXXDDDDDDDDDDDD

private final static Pattern IDENTIFIERPATTERN = Pattern.compile("([a-zA-Z]{3,})(\d{3})(\d{6})(\d{2})");
String extractedString = IDENTIFIERPATTERN.matcher(removedNonChars)     //returns a match on XYZ123412345612

一旦我得到了具有我正在寻找的格式的字符串(即XYZ123412345612),我想从原始的非修改字符串中提取该字符串(即值XYZ1234-123456-12

注意 - 连字符只是一个例子,NONCHARACTER可以是任何非字母数字字符 - 示例:

Lorem ipsum XYZ1234-123456-12 lorem ipsum
Lorem ipsum XYZ123412345612 lorem ipsum
Lorem ipsum XYZ1234 123456 12 lorem ipsum
Lorem ipsum XYZ1234!123456#12 lorem ipsum
Lorem ipsum XYZ1234--123456#12 lorem ipsum

基本上我正在做的是在字符串中搜索标识符。标识符通常具有定义的格式,但有时人们不使用标识符的规则,因此我搜索字符串中没有非字符。在我提取了没有非字符的字符串后,我想用非字符提取原始字符串。

如何使用在初始搜索中作为匹配项返回的字符串从原始字符串中提取字符串。

修改

分隔符始终为非字母数字。即不是数字而不是字符(即只有特殊字符,如 - ,#£$“(!__£($&£^”并包括'空格'字符)。

提前致谢。

1 个答案:

答案 0 :(得分:1)

通过替换那些非数字字符,您将使您的任务变得困难。相反,你应该制作一个直接从字符串中提取该部分的正则表达式。

这里的问题是,您不能直接执行\\d{12},因为数字不是连续的。所以,让我们修改那个部分。由于您之间可以包含0个或更多非字母字符,因此您可以使用 - \\d\\D*代替\\d,并应用11次匹配,最后匹配单个数字

所以你可以使用以下正则表达式:

"[a-zA-Z]{3}(\\d\\D*){11}\\d)"

将其与Matcher#find()方法一起使用,并从中获取整个群组。

String str = "Lorem ipsum XYZ1234-123456-12 lorem ipsum";

Pattern pattern = Pattern.compile("[a-zA-Z]{3}(\\d\\D*){11}\\d");
Matcher matcher = pattern.matcher(str);

if (matcher.find()) {
    System.out.println(matcher.group());
}

输出:

XYZ1234-123456-12

<强>更新

如果数字之间的分隔符是非字母数字,那么您可以使用[\\W_]代替\\D,正如@Pshemo在评论中已经指出的那样:

"[a-zA-Z]{3}(\\d[\\W_]*){11}\\d"