1

我的字符串 ( MY_STRING) 的内容可能采用以下格式:

bla bla...this is the id of product bla bla:#31 5 2 0000 12please verify bla bla ...

或者

bla bla...this is the id of product bla bla: #31 5 2 0000 12, please verify bla bla...

或者

bla bla...this is the id of product bla bla: #31 5 2 0000 12 please verify bla bla...

我想从字符串中提取产品 ID。上例中的产品 ID 为#31 5 2 0000 12

产品ID的格式是#开头,后面跟着随机数(长度不限),数字之间的空格也是任意的

我当前提取产品 ID 的代码是:

Pattern pattern = Pattern.compile("^#\\d+(\\s+\\d+)*$");
Matcher matcher = pattern.matcher(MY_STRING);
if(phoneNrMatcher.find()){
    System.out.println(matcher.group(0));                   
}

但它不起作用,有人可以帮助我哪里出错了吗?可能是正则表达式?

笔记:

- 在我的示例中,ID #31 5 2 0000 12之前和之后的内容是任意的。

- 产品 ID 字符串始终以 # 开头,后面紧跟一个数字,不带空格或其他字符

4

2 回答 2

3

试试这个

String test = "bla bla...this is the tag id of product: #31 5 2 0000 12, please verify bla bla...";
// explanation of the Pattern:
//                                |starts with "#"
//                                | |directly followed by digits only
//                                | |   |character class including digits or spaces
//                                | |   |       |ad lib (greedy quantifier)
Pattern pattern = Pattern.compile("#\\d+[\\d\\s]+");

Matcher matcher = pattern.matcher(test);
// using a while group here so you may have multiple matches
while (matcher.find()) {
    System.out.println(matcher.group());
}

输出

#31 5 2 0000 12

说明

在这种情况下,您不需要在 Pattern 中提及行的开头或结尾。此外,我的示例中的 Pattern 将允许您在同一个字符串中找到多个 id,前提是它们由一个既不是空格也不是数字的字符分隔。

于 2013-06-06T12:50:25.843 回答
1

您有正则表达式(^$)的输入锚点的开头和结尾。删除它们!

顾名思义,输入锚的开头使得正则表达式无法匹配输入开头之外的任何其他位置;输入锚的结尾是这样......你得到了图片。除此之外,正则表达式很好。

(顺便说一句,你可以使用.group(),它与 相同.group(0)

(顺便说一句 2:如果您在一个输入中有多个数字,请循环m.find()

于 2013-06-06T12:50:40.753 回答