我正在尝试从@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
答案 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)
您需要在[
]
Pattern
和selectionIdPattern
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));