当前位置: 首页 > 面试题库 >

Java正则表达式实现中的错误?

韶亮
2023-03-14
问题内容

我已经在Java的正则表达式实现中发现了一些意外行为。当使用java.util.regex.Pattern和时java.util.regex.Matcher,在使用Matcher的方法时,以下正则表达式在输入上

正确"Merlot"匹配find()

((?:White )?Zinfandel|Merlot)

如果更改最外层匹配组中表达式的顺序,则Matcher的find()方法
匹配。

(Merlot|(?:White )?Zinfandel)

这是一些说明此问题的测试代码。

RegexTest.java

import java.util.regex.*;

public class RegexTest {
    public static void main(String[] args) {
        Pattern pattern1 = Pattern.compile("((?:White )?Zinfandel|Merlot)");
        Matcher matcher1 = pattern1.matcher("Merlot");
        // prints "No Match :("
        if (matcher1.find()) {
            System.out.println(matcher1.group(0));
        } else {
            System.out.println("No match :(");
        }

        Pattern pattern2 = Pattern.compile("(Merlot|(?:White )?Zinfandel)");
        Matcher matcher2 = pattern2.matcher("Merlot");
        // prints "Merlot"
        if (matcher2.find()) {
            System.out.println(matcher2.group(0));
        } else {
            System.out.println("No match :(");
        }
    }
}

预期的输出是:

Merlot
Merlot

但是实际输出是:

No Match :(
Merlot

我已经验证了Ubuntu Linux上的Java版本1.7.0_11和OSX
10.8.2上的Java版本1.6.0_37中存在此意外行为。我昨天将此行为报告为Oracle的错误,并收到一封自动电子邮件,告诉我我的错误报告已收到并且内部审阅ID为2441589。当我在他们的错误中搜索该ID时找不到我的错误报告。数据库。(你能听到the吗?)

我是否发现了Java可能经过全面测试和使用的regex实现中的错误(在2013年很难相信),或者我做错了什么?


问题答案:

它似乎在Java
1.8中
已修复。

Welcome to Scala version 2.11.0-20130930-063927-2bba779702 (Java HotSpot(TM) 64-Bit Server VM, Java 1.8.0-ea).
Type in expressions to have them evaluated.
Type :help for more information.

scala> import java.util.regex._
import java.util.regex._

scala> Pattern.compile("((?:White )?Zinfandel|Merlot)")
res0: java.util.regex.Pattern = ((?:White )?Zinfandel|Merlot)

scala> .matcher("Merlot")
res1: java.util.regex.Matcher = java.util.regex.Matcher[pattern=((?:White )?Zinfandel|Merlot) region=0,6 lastmatch=]

scala> .find()
res2: Boolean = true


 类似资料:
  • 下面是我正在使用的正则表达式的最新版本,它抛出了错误“Invalid regular expression” XSD:正则表达式在位置4验证失败:当前选项设置不支持此表达式。 我在xsd文件中得到了这个异常,我正在message broker(IIB)中开发这个xsd。有谁能帮我解决这个问题吗?

  • 问题内容: 我回答的问题让我感到奇怪: 如何在Python中实现正则表达式?有什么样的效率保证?实施是“标准”还是会更改? 我认为正则表达式将实现为DFA,因此非常有效(最多需要扫描输入字符串一次)。Laurence Gonsalves提出了一个有趣的观点,即并非所有的Python正则表达式都是正则表达式。(他的示例是r“(a +)b \1”,它与一定数量的a,ab匹配,然后与之前相同的a数量匹配

  • 问题内容: 我正在尝试输入之间的内容,我的模式没有做正确的事,请帮忙。 下面是sudocode: 要求的输出: 之一 二 三 问题答案: 先行使用并在循环中使用,而不是: 看到它在线上工作:ideone 但是最好在这里使用split: 看到它在线上工作:ideone

  • 主要内容:正则表达式支持字符正则表达式(Regular Expression)又称正规表示法、常规表示法,在代码中常简写为 regex、regexp 或 RE,它是计算机科学的一个概念。 正则表达式是一个强大的字符串处理工具,可以对字符串进行查找、提取、分割、替换等操作,是一种可以用于模式匹配和替换的规范。一个正则表达式就是由普通的字符(如字符 a~z)以及特殊字符(元字符)组成的文字模式,它用以描述在查找文字主体时待匹配的

  • 问题内容: 您好,来自Java文档: UNIX_LINES 启用Unix行模式。 在这种模式下,只有行结束在行为的认可,和。 Unix行模式也可以通过嵌入式标志表达式启用 。 有人用其他词语来定义它的作用吗?我了解,“\ n”转义序列是只承认后,和。显然我被误解了。 问题答案: 至于它们如何专门用于正则表达式行为;,和取决于换行符的定义以起作用。 匹配除换行符以外的任何内容 可以匹配一行的开头 可

  • 昨天,我需要向正则表达式添加一个文件路径,创建一个如下所示的模式: 一开始正则表达式不匹配,因为包含几个正则表达式特定的符号,如 或 。作为快速修复,我将它们替换为 和 . 与 . 然而,我问自己,是否没有一种更可靠或更好的方法来清除正则表达式特定符号中的字符串。 Python 标准库中是否支持此类功能? 如果没有,您是否知道一个正则表达式来识别所有正则表达式并通过替代品清理它们?