我知道Java正则表达式不支持变长的后向查找,并且以下内容会导致错误
(?<=(not exceeding|no((\\w|\\s)*)more than))xxxx
但是当*被这样的固定长度说明符替换时
(?<=(not exceeding|no((\\w|\\s){0,30})more than))xxxx
它仍然失败。为什么是这样?
因此,您认为Java不支持无限向后看吗?
但是下面的模式会编译!
(?<=\d+)\w+
…尽管在Match All中会产生意想不到的结果(请参阅demo)。
在另一方面,你可以成功使用该其他无限回顾后(我以极大的惊喜发现这个问题)
(?<=\\G\\d+,\\d+,\\d+),
拆分此字符串: 0,123,45,6789,4,5,3,4,6000
它将正确输出(请参阅在线演示):
0,123,45
6789,4,5
3,4,6000
这次的结果就是您所期望的。
但是,如果您使用来微调正则表达式以获得对而不是三胞胎(?<=\\G\\d+,\\d+),
,则这次不会分裂(请参见演示)。
众所周知,Java落后是越野车。 知道这一点后,我建议您 不要浪费时间尝试理解为什么它会做 未记录的 事情 。
促使我得出这个结论的决定性词是扬·格瓦特斯(Jan Goyvaerts)的话,他是 Regex Cookbook 的合著者,也是一个Arch-
regex专家,他创造了一个出色的regex引擎,需要保持领先地位regex为其调试工具RegexBuddy提供了阳光:
Java在其后向实现中存在许多错误。其中一些(但不是全部)已在Java 6中修复。
问题内容: 我一直认为,Java的regex-API(以及与此相关的许多其他语言)中的后置断言必须具有明显的长度。因此,STAR和PLUS量词在内部回顾中是不允许的。 优秀的在线资源regular-expressions.info似乎证实了我的一些假设: “ […] Java通过允许有限重复而向前迈进了一步。你仍然不能使用星号或加号,但是可以使用问号和花括号以及指定的max参数。Java认识到有限
问题内容: 给定一个包含一定数量的方括号和其他字符的字符串,我想找到所有以方括号开头并带有一定数量字母的方括号。例如,如果字符串是 ] [abc] [123] abc] 我只想找到第二个结束括号。 以下正则表达式 (?<= [az] +)\] 会找到第二个结束括号,也是最后一个: ] [abc ] [123] abc ] 由于我只想查找第一个,因此我对正则表达式进行了明显的更改。 (?<= \ [
我不确定这是否可以使用正则表达式。我会尝试使用正则表达式,但如果不可能,我会切换到双重验证。 我的数据库(postgresql)接受为15,6(最多15位,最多6位小数),因此如果我有10位整数,我可以有5位小数。小数分隔符被忽略。 我目前有一个正则表达式(逗号是小数分隔符): 它不验证总长度,只验证左侧的数字。但由于用户也可以键入点(千位分隔符),我有一个怪物:
我想验证一个数字最大长度为13、小数点为2的货币字符串。我用逗号作为十进制分隔符,用句点作为千位分隔符。 我有一个正则表达式: For sintax有效,但不适用于最大长度。我需要在这个正则表达式中添加什么? 例如,这些字符串必须有效: 这些必须是无效的:
我需要根据给定条件验证输入, -总长度必须为20个字符-前五个位置必须是字母-剩余的应该是数字,但必须存在一个连字符(-),该连字符只能出现在数字之间。我喜欢正则表达式 但它也允许在结尾使用连字符,甚至可以不使用连字符。
我正在尝试构建一个正则表达式,它接受具有以下条件的域名: 允许DNS名称(仅允许连字符、句点和字母数字字符)最多255个字符 连字符只能出现在字母之间 应该以字母开头,以字母结尾。它至少有3个字符(字母和句点必填,连字符可选)。 周期前标签的长度应为63 可能的情况: a、 b.c a-a.b 不该通过的案子 a-b q wert q wert q wert q wert q wert q wer