首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Reqular表达式-使用regex搜索字符串并从原始字符串中提取匹配。

Reqular表达式-使用regex搜索字符串并从原始字符串中提取匹配。
EN

Stack Overflow用户
提问于 2014-02-09 17:32:26
回答 1查看 138关注 0票数 0

假设我有以下字符串。

代码语言:javascript
复制
Lorem ipsum XYZ1234-123456-12 lorem ipsum

我希望在字符串中搜索任何具有模式XXXDDDDDDDDDDDD的字符串(即3个字符,后面是12个数字,忽略任何非字母数字字符)。

为了达到这个目的,我做了这样的事情

代码语言:javascript
复制
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)。

代码语言:javascript
复制
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)中提取该字符串。

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

代码语言:javascript
复制
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

基本上,我所做的是搜索一个字符串的标识符。标识符通常有一个定义的格式,但有时人们不使用规则作为标识符,因此我搜索时没有字符串中的非字符。在没有非字符的情况下提取字符串后,我想提取带有非字符的原始字符串。

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

编辑

分隔符总是非字母数字的.即不是数字,也不是字符(即只有特殊字符,如-、#£$“(!__£($&£^)并包括‘空格’字符)。

提前谢谢。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-02-09 17:39:11

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

这里的问题是,您不能直接执行\\d{12},因为数字不是连续的。那么,让我们修改这个部分。因为在中间可以有0或更多的非数字字符,所以可以使用- \\d\\D*而不是\\d,并应用匹配的11时间,并在最后匹配个位数。

因此,您可以使用以下正则表达式:

代码语言:javascript
复制
"[a-zA-Z]{3}(\\d\\D*){11}\\d)"

将它与Matcher#find()方法一起使用,并将整个组从它中提取出来。

代码语言:javascript
复制
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());
}

输出:

代码语言:javascript
复制
XYZ1234-123456-12

更新:

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

代码语言:javascript
复制
"[a-zA-Z]{3}(\\d[\\W_]*){11}\\d"
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21662444

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档