1

我正在寻找有关此正则表达式的帮助。我有不同长度的字符串,并且只想匹配开头。字符串中有换行符,所以看起来 \A 是要走的路。

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

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

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

我最初的解决方案是:

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

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

我目前最好的尝试是:

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

但是,如果 之后有任何内容,这不起作用mon>,则匹配失败。

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

4

1 回答 1

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 组将满足您的需求。

教程可能会解释组如何工作

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

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

于 2013-08-09T14:25:38.243 回答