使用带有符号的正则表达式,例如“<”

时间:2017-04-25 07:57:28

标签: java regex

我有一个字符串<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上搜索了解决方案,但仍然没有解决这个问题

2 个答案:

答案 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. 如果您可以获得多个结果
  2. ,则可以使用while
  3. 您必须使用matcherThread.group(1)代替matcherThread.group(),因为最后一次返回<Thread> 'data we need' </Thread>
  4. 你可以找到一个演示here,你可以找到一个代码示例here

答案 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