我正在寻找有关此正则表达式的帮助。我有不同长度的字符串,并且只想匹配开头。字符串中有换行符,因此看起来\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
上的示例很少,我无法让它工作。
最佳答案
您缺少的是分组的概念。我已经将你的正则表达式放入 (
中括号
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可能会解释团体如何运作
I am simply looking for a way to get a binary answer similar to String.matches(), which upon finding a match stop going through the string
拿这个:\\A(?:\\s*<?.*?>)?\\s*<lemon>(.*?)
没有分组
关于Java正则表达式 "\A"边界匹配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18148756/