gpt4 book ai didi

java - 如何在java中匹配最大长度的正则表达式

转载 作者:行者123 更新时间:2023-11-29 03:43:37 26 4
gpt4 key购买 nike

public static void main(String[] args) {

Pattern compile = Pattern
.compile("[0-9]{1,}[A-Za-z]{1,}|[A-Za-z][0-9]{1,}|[a-zA-Z][a-zA-Z0-9\\.\\-_/#]{2,}|[0-9]{3,}[A-Za-z][a-zA-Z0-9\\.\\-_/#]*|[0-9][0-9\\-]{4,}|[0-9][0-9\\-]{3,}[a-zA-Z0-9\\.\\-_/#]+");
Matcher matcher = compile.matcher("i5-2450M");
matcher.find();
System.out.println(matcher.group(0));
}

我假设这应该返回 i5-2450M 但实际上它返回 i5

最佳答案

问题是使用了匹配的第一个交替。

在这种情况下,第二个交替([A-Za-z][0-9]{1,},与 i5 匹配)“隐藏”任何后续交替。

// doesn't match
[0-9]{1,}[A-Za-z]{1,}|
// matches "i5"
[A-Za-z][0-9]{1,}|
// the following are never even checked, because of the previous match
[a-zA-Z][a-zA-Z0-9\\.\\-_/#]{2,}|
[0-9]{3,}[A-Za-z][a-zA-Z0-9\\.\\-_/#]*|
[0-9][0-9\\-]{4,}|
[0-9][0-9\\-]{3,}[a-zA-Z0-9\\.\\-_/#]

(请注意,帖子中的正则表达式可能存在严重问题——例如,0---# 将与最后一条规则匹配——这应该得到解决,但由于不是交替行为的“基本”问题,所以不低于。)

要解决此问题,请先安排最具体 的交替。在这种情况下,它将把第二个交替放在其他交替条目下面。 (还要回顾其他交替和交互;也许整个正则表达式可以简化?)

使用简单的单词边界 (\b) 在这里不起作用,因为 - 被认为是非单词字符。但是,根据正则表达式的含义,可以在交替周围使用 anchor ($^):例如^existing_regex$。这不会改变交替的行为,但它导致 i5 的初始匹配被回溯,从而导致后续的交替条目被考虑,由于无法在交替组之后立即匹配输入结束。


来自 Java regex alternation operator "|" behavior seems broken :

Java uses an NFA, or regex-directed flavor, like Perl, .NET, JavaScript, etc., and unlike sed, grep, or awk. An alternation is expected to quit as soon as one of the alternatives matches, not hold out for the longest match.

(此问题中接受的答案使用单词边界。)

来自 Pattern :

The Pattern engine performs traditional NFA-based matching with ordered alternation as occurs in Perl 5.

关于java - 如何在java中匹配最大长度的正则表达式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12048524/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com