假设我有以下字符串。
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)中提取该字符串。
注-连字符只是一个例子,非字符可以是任何非字母数字字符-示例:
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基本上,我所做的是搜索一个字符串的标识符。标识符通常有一个定义的格式,但有时人们不使用规则作为标识符,因此我搜索时没有字符串中的非字符。在没有非字符的情况下提取字符串后,我想提取带有非字符的原始字符串。
如何使用在初始搜索中作为匹配返回的字符串从原始字符串中提取字符串。
编辑
分隔符总是非字母数字的.即不是数字,也不是字符(即只有特殊字符,如-、#£$“(!__£($&£^)并包括‘空格’字符)。
提前谢谢。
发布于 2014-02-09 17:39:11
通过替换这些非数字字符,你将使你的任务变得很困难。相反,您应该做一个正则表达式,直接从字符串中提取该部分。
这里的问题是,您不能直接执行\\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"https://stackoverflow.com/questions/21662444
复制相似问题