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

正则表达式中的奇怪行为

柳鸿信
2023-03-14
问题内容

关于正则表达式有一个问题,试图回答我发现了另一个奇怪的事情。

String x = "X";
System.out.println(x.replaceAll("X*", "Y"));

这将打印YY。为什么??

String x = "X";
System.out.println(x.replaceAll("X*?", "Y"));

这会打印YXY

为什么勉强的正则表达式与“
X”字符不匹配?有"noting"X"nothing",但为什么第一次不匹配三个符号和匹配的是两个,然后一个而不是三个?和第二个正则表达式仅匹配"nothing"s而不匹配X


问题答案:

让我们依次考虑它们:

"X".replaceAll("X*", "Y")

有两个匹配项:

  1. 在字符位置0处X被匹配,并被替换为Y
  2. 在字符位置1,空字符串被匹配,Y并被添加到输出中。

最终结果:YY

"X".replaceAll("X*?", "Y")

还有两个匹配项:

  1. 在字符位置0,空字符串被匹配,Y并被添加到输出中。 比赛中没有消耗 此位置上的字符,X因此将其逐字复制到输出中。
  2. 在字符位置1,空字符串被匹配,Y并被添加到输出中。

最终结果:YXY



 类似资料:
  • 我使用BufferedReader读取了一个txt文件。我将每一行添加到一个长字符串中,并将前面发布的代码应用于此。整个代码如下: 文本文件是一篇我想删除不是字母的所有内容(包括空白空间)的普通文章。摘录如下:“[16]自由软件基金会(FSF)成立于1985年,其本意是”自由“一词指的是发行的自由。”

  • 我正在尝试使用来选择性地替换字符串的一部分。我正在PowerShell ISE中编写和调试该函数。奇怪的是,运行替换代码会导致一台机器输出一个字符串,该字符串是匹配评估器脚本块的内容,而另一台机器会正确替换文本。我不知道这是可能的,也不知道为什么会发生这种情况。 给出这段代码(借用另一个stackoverflow的回答): 在一台机器上执行它会导致输出(PowerShell版本): 但在另一个页面

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

  • 问题内容: 当我使用上面的代码时,没关系。但是我不明白使用此regexpr时发生了什么。它打印。 如何将圆点作为特定符号?还是如何使一类具有\ n和\ r的任意字符的符号? 问题答案: 但是我不明白使用此regexpr [。] *会发生什么情况。说我错了。 因为在字符类中,点失去了特殊的意义,将与普通的旧点(字符)匹配。 在字符类之外,点是一个与任何字符匹配的元字符,不包括换行符(当然,除非使用修

  • 有没有人试图描述与正则表达式匹配的正则表达式? 由于重复的关键字,这个主题几乎不可能在网上找到。 它可能在实际应用程序中不可用,因为支持正则表达式的语言通常具有解析它们的方法,我们可以将其用于验证,以及一种在代码中分隔正则表达式的方法,可用于搜索目的。 但是我仍然想知道匹配所有正则表达式的正则表达式是什么样子的。应该可以写一个。

  • 在 OpenResty 中,同时存在两套正则表达式规范:Lua 语言的规范和 ngx.re.* 的规范,即使您对 Lua 语言中的规范非常熟悉,我们仍不建议使用 Lua 中的正则表达式。一是因为 Lua 中正则表达式的性能并不如 ngx.re.* 中的正则表达式优秀;二是 Lua 中的正则表达式并不符合 POSIX 规范,而 ngx.re.* 中实现的是标准的 POSIX 规范,后者明显更具备通用