Java匹配器找不到匹配项,即使正则表达式单独工作。

3
我正在尝试从给定的字符串中获取一个“预览”,并将其作为值放入HashMap中。所谓的“预览”是指以单词边界结尾的子字符串(最大长度为50个字符)。
以下是一个代码示例,展示了我如何尝试实现这一功能:
import java.util.regex.*;             

public class Test {                    
  public static void main(String[] args) throws Exception {
    final Pattern pattern = Pattern.compile("(^.{0,50}\b)"); 
    final Matcher m = pattern.matcher(
        "This is a long string that I want to find a shorter teaser for."); 
    if (m.find()) {
      System.out.println("Found: " + m.group(1)); 
    } else {  
      System.out.println("No match");   
    }                                                          
  }             
}    

我预期它会打印出来:
Found: This is a long string that I want to find a

但是它印出的是:
No match

如果我单独测试这个正则表达式,它会按预期工作 - 它会找到一个最大长度为50个字符且以单词边界结束的值的子字符串。但是如果我调试它,m.find总是返回false。
有什么解决办法吗?(我专注于获取摘要,而不是使用Matcher.find() ;-) )

5
使用:Pattern.compile("(^.{0,50}\\b)")这段代码是用于编译一个正则表达式,其中:
  • ^ 表示匹配行的开头
  • .{0,50} 表示匹配长度为 0 到 50 个字符的任意字符(除了换行符)
  • \\b 表示匹配单词边界
因此,这个正则表达式将匹配一个字符串的前 50 个字符,并确保它以一个单词结尾。
- anubhava
1
除了Anubhava所说的,将你的pattern.compile声明在循环外面。你不必每次都创建它们。 - minion
谢谢你的帮助,我已经将它从所有循环中解决了。 - anna
1个回答

3
根据Oracle字符文档,\b是字符串中退格的转义序列。然而,您需要将\b更改为单词边界的正则表达式,因此需要将斜杠更改为文字斜杠,即\\,以便Pattern.compile看到\b。
Pattern.compile("(^.{0,50}\\b)")

你可以通过在String上调用.toCharArray()来看到这个效果。
单斜杠。
System.out.println(Arrays.toString("\b".toCharArray()));
=> []

双斜杠

System.out.println(Arrays.toString("\\b".toCharArray()));
=> [\, b]

糟糕!非常感谢,第二个斜杠是缺失的...现在完美地工作了! - anna

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接