我有一个字符串<Thread> 'data we need' </Thread>
,我想提取'data we need'
。
我一直在使用它,但它没有任何结果:
Pattern patternThread = Pattern.compile("<Thread(.*?)/Thread>");
Matcher matcherThread = patternThread.matcher(a);
if (matcherThread.find()) {
System.out.println("Thread Oke");
System.out.println(matcherThread.group(1));
}
我知道问题是"<" and the "/"
。
那么,有什么建议吗? 我已经尝试过“//”和“/” 这是我的老jdk?它在7.2 我已经在oracle上搜索了解决方案,但仍然没有解决这个问题
答案 0 :(得分:2)
您可以使用此正则表达式<Thread>(.*?)</Thread>
:
Pattern patternThread = Pattern.compile("<Thread>(.*?)</Thread>");
Matcher matcherThread = patternThread.matcher("<Thread> 'data we need' </Thread>");
while (matcherThread.find()) {
System.out.println(matcherThread.group(1));
}
<强>输出强>
'data we need'
答案 1 :(得分:0)
如果你想跳过撇号,那么你也可以使用这个正则表达式:\\s*<Thread[^>]*>[^']*'(.*?)'.*?</Thread>\\s*
。
说明:
\\s*
将匹配一些空格,包括新行<Thread[^>]*
将匹配完整的<Thread>
代码,即使是属性[^']*
将匹配第一个撇号的每个字符'(.*?)'
将匹配撇号之间的所有内容。但是,撇号在组的外。所以你捕获的只是撇号之间的东西。.*?</Thread>
懒惰地匹配结束</Thread>
标记\\s*
将匹配一些空格,包括新行这是完整的代码:
// Update: the pattern tolerates white spaces at both ends of the regex
Pattern patternThread = Pattern.compile("\\s*<Thread[^>]*>[^']*'(.*?)'.*?</Thread>\\s*");
// Update: string below contains newline
Matcher matcherThread = patternThread.matcher("<Thread> 'data we need' </Thread>\r\n");
if (matcherThread.find()) {
System.out.println("Thread Oke");
System.out.println(matcherThread.group(1));
}
输出结果为:
Thread Oke
data we need