Java正则表达式“\ A”边界匹配

时间:2013-08-09 14:13:58

标签: java regex matching

我正在寻找这个正则表达式的一些帮助。我有不同长度的字符串,并且只想匹配开头。这些字符串中有换行符,所以它似乎是\ A是要走的路。

我想要符合以下所有情况的正则表达式:

OPTIONAL: [any whitespace/newlines/etc] 
OPTIONAL: <?.*?>
OPTIONAL: [any whitespace/newlines/etc]
MANDAORY: <lemon>
OPTIONAL: anything afterwards.

由于字符串可能变得很大,因此最终的可选匹配会使这一点非常慢。

我最初的解决方案是:

"(^\\s*<?.*?>\\s*<lemon>)[\\s\\S]*|(^\\s*<lemon>.*)[\\s\\S]*"

这是非常复杂的,并且匹配整个字符串而不仅仅是开始

我目前最好的尝试是:

"\\A(?:\\s*<?.*?>)?\\s*<lemon>"

但是,如果mon>之后有任何内容,则此操作无效,则匹配失败。

有没有人知道为什么? \A上的示例很稀疏,我无法让它工作。

1 个答案:

答案 0 :(得分:0)

您缺少的是分组的概念。我已经把你的正则表达式放到(括号

 Pattern p = Pattern.compile("(\\A(?:\\s*<?.*?>)?\\s*<lemon>).*");
 Matcher m = p.matcher("   <?.*?>    <lemon> hi   ");
 if (m.find()) {
    System.out.println(m.group(1)); 
 }

组0将是整个表达式

第1组将是您所需要的。

tutorial可能会解释群组如何运作

  

我只是想找到一种方法来获得类似于String.matches()的二进制答案,在找到匹配停止字符串时

这样做:\\A(?:\\s*<?.*?>)?\\s*<lemon>(.*?)没有分组