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

为什么此正则表达式中的后向表达式没有“明显的最大长度”?

左丘成仁
2023-03-14
问题内容

给定一个包含一定数量的方括号和其他字符的字符串,我想找到所有以方括号开头并带有一定数量字母的方括号。例如,如果字符串是

] [abc] [123] abc]

我只想找到第二个结束括号。

以下正则表达式

(?<= [az] +)\]

会找到第二个结束括号,也是最后一个:

] [abc ] [123] abc ]

由于我只想查找第一个,因此我对正则表达式进行了明显的更改。

(?<= \ [[ [az] +)\]

…并且我得到“ Look-behind组在索引11附近没有明显的最大长度”。

\[只是一个字符,因此无论第一个表达式中后向组的明显最大长度是多少,似乎最大长度应该为1 +。是什么赋予了?

预计 到达时间 不只 限于左 括号。

(?<= a [bz] +)\]

给我同样的错误。(好吧,在索引12。)


问题答案:

\ [只是一个字符,因此无论第一个表达式中后向组的明显最大长度是多少,似乎最大长度应该是1 +。是什么赋予了?

关键是, “无论第一个表达式中后向组的明显最大长度是多少” ,这 都不是
显而易见的。拳头的规则是,你不能使用+或者*一个向后看的内部。这不仅对于Java的正则表达式引擎如此,而且对于更多PCRE风格的引擎(甚至Perl的(v5.10)引擎!)也是如此。

您可以提前进行以下操作:

Pattern p = Pattern.compile("(?=(\\[[a-z]+]))");
Matcher m = p.matcher("] [abc] [123] abc]");
while(m.find()) {
  System.out.println("Found a ']' before index: " + m.end(1));
}

(即,可以使用前瞻(!)内的捕获组来获取end(...)该组中的捕获组)

将打印:

在索引前找到一个“]”:7

编辑

而且,如果您有兴趣替换此类],可以执行以下操作:

String s = "] [abc] [123] abc] [foo] bar]";
System.out.println(s);
System.out.println(s.replaceAll("(\\[[a-z]+)]", "$1_"));

它将打印:

] [abc] [123] abc] [foo]条]
] [abc_ [123] abc] [foo_ bar]


 类似资料:
  • 问题内容: 我知道Java正则表达式不支持变长的后向查找,并且以下内容会导致错误 但是当*被这样的固定长度说明符替换时 它仍然失败。为什么是这样? 问题答案: Java Lookbehind臭名昭著 因此,您认为Java不支持无限向后看吗? 但是下面的模式会编译! …尽管在Match All中会产生意想不到的结果(请参阅demo)。 在另一方面,你可以成功使用该其他无限回顾后(我以极大的惊喜发现这

  • 问题内容: 我一直认为,Java的regex-API(以及与此相关的许多其他语言)中的后置断言必须具有明显的长度。因此,STAR和PLUS量词在内部回顾中是不允许的。 优秀的在线资源regular-expressions.info似乎证实了我的一些假设: “ […] Java通过允许有限重复而向前迈进了一步。你仍然不能使用星号或加号,但是可以使用问号和花括号以及指定的max参数。Java认识到有限

  • 我不确定这是否可以使用正则表达式。我会尝试使用正则表达式,但如果不可能,我会切换到双重验证。 我的数据库(postgresql)接受为15,6(最多15位,最多6位小数),因此如果我有10位整数,我可以有5位小数。小数分隔符被忽略。 我目前有一个正则表达式(逗号是小数分隔符): 它不验证总长度,只验证左侧的数字。但由于用户也可以键入点(千位分隔符),我有一个怪物:

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

  • 我想验证一个数字最大长度为13、小数点为2的货币字符串。我用逗号作为十进制分隔符,用句点作为千位分隔符。 我有一个正则表达式: For sintax有效,但不适用于最大长度。我需要在这个正则表达式中添加什么? 例如,这些字符串必须有效: 这些必须是无效的:

  • 问题内容: 我正在尝试编写一个正则表达式来检查给定的字符串是否像a + b,2 + a + b,3 + 6 * 9 + 6 * 5 + a * b等… 仅+和*运算符。 我试过了 不幸的是,它仅处理3 * 7 …(数字*数字)之类的情况。 等待您的答案,感谢您的阅读。 问题答案: 把和字符类中。 演示