使用Regex匹配String中的数字

时间:2013-09-03 10:42:34

标签: java regex

我正在尝试从@id表达式中解析xPath的值,如:

"/hrdg:data/hrdg:meeting[@code='30J7Q']/hrdg:event[@id='2545525']/hrdg:selection[@id='31192111']"

我已编写此正则表达式,并使用以下代码进行匹配:

 Pattern selectionIdPattern = Pattern.compile(".*/hrdg:selection[@id=\'(\\d+)\'].*");
 // Grab the xPath from the XML.
 xPathData = // Loaded from XML..;
 // Create a new matcher, using the id as the data.
 Matcher matcher = selectionIdPattern.matcher(xPathData);
 // Grab the first group (the id) that is loaded.
 if(matcher.find())
 {
     selectionId = matcher.group(1);
 }

但是selectionId不包含@id=之后的值。

期望结果的例子

例如,通过上述声明,我想得到:

"/hrdg:data/hrdg:meeting[@code='30J7Q']/hrdg:event[@id='2545525']/hrdg:selection[@id='31192111']"

Data I want: 31192111

5 个答案:

答案 0 :(得分:2)

String s = "/hrdg:data/hrdg:meeting[@code='30J7Q']/hrdg:event[@id='2545525']/hrdg:selection[@id='31192111']";
Pattern pattern = Pattern.compile("(?<=selection\\[@id=')\\w+(?='])");
Matcher matcher = pattern.matcher(s);
matcher.find();
System.out.println(matcher.group());

输出:31192111

答案 1 :(得分:2)

您需要转义[],因为它们也是正则表达式字符。

如果您正在find(而不是matches),您可以在开始和结束时取出.*

正则表达式:

"/hrdg:selection\\[@id='(\\d+)'\\]"

答案 2 :(得分:1)

您需要在[ ]

中使用的正则表达式中转义character class个字符PatternselectionIdPattern
String xPathData = "/hrdg:data/hrdg:meeting[@code='30J7Q']/hrdg:event[@id='2545525']/hrdg:selection[@id='31192111']";
Pattern selectionIdPattern = Pattern.compile(".*/hrdg:selection\\[@id=\'(\\d+)\'\\]");
Matcher matcher = selectionIdPattern.matcher(xPathData);
if (matcher.find()) {
     String selectionId = matcher.group(1); // now matches 31192111
     ...
}

由于Matcher#find会进行部分匹配,因此也可以从表达式中删除威尔卡字符.*

答案 3 :(得分:1)

[]字符表示匹配中间的字符。你需要逃避方括号。

答案 4 :(得分:1)

如果你的所有字符串都是这样,你可以尝试这个

 String str="/hrdg:data/hrdg:meeting[@code='30J7Q']/
    hrdg:event[@id='2545525']/hrdg:selection[@id='31192111']";
 int index=str.lastIndexOf("@id");
 System.out.println(str.substring(index+5,str.length()-2));