我有regex代码
https://regex101.com/r/o5gdDt/8
就像你看到的这段代码
(?<!\S)(?<![\d,])(?:(?!(?:1[2-9]\d\d|20[01]\d|2020))\d{4,}[\u00BC-\u00BE\u2150-\u215E]?|\d{1,3}(?:,\d{3})+)(?![\d,])[\u00BC-\u00BE\u2150-\u215E]?(?!x)(?!/)可以捕获所有在文本中由3位数字输出的数字,如
全部超过4位数,如无逗号分隔。
也是这样的数字
这里唯一的小问题是,如果在前两种类型之后有一个逗号(点),它就不能捕获这些。例如,它无法捕获
不幸的是,这里有一些以comma...can结尾的数字,有人给了我一个关于如何修改这个以捕获上面的内容的想法?
我试过这样做,修改后的版本如下:
(?<!\S)(?<![\d,])(?:(?!(?:1[2-9]\d\d|20[01]\d|2020))\d{4,}[\u00BC-\u00BE\u2150-\u215E]?|\d{1,3}(?:,\d{3})+)(?![\d])[\u00BC-\u00BE\u2150-\u215E]?(?!x)(?!/)基本上,我删除了逗号在(?)但在我的上下文中,它引起了另一个问题,它捕获了一个数字的一部分,它是这样的等式的一部分:
4 310 747 475 x2 57 349 565 416 398 x
见这里:
https://regex101.com/r/o5gdDt/10
我知道这是个特别的问题我很乐意了解你的偶像
发布于 2019-10-15 09:29:32
这里的主要问题是,当匹配后面跟着一个数字或逗号时,(?![\d,])会失败,而当匹配后面跟着一个数字或一个逗号加上一个数字时,您想要失败。
将(?![\d,])替换为(?!,?\d)。
而且,(?<!\S)(?<![\d,])看起来是多余的,因为(?<!\S)需要空格或字符串的开始,这肯定不是数字或,。根据您的需求使用(?<!\S)或(?<!\d)(?<!\d,)。
用OR:(?!x)(?!/) => (?!x|/) => (?![x/])加入负外观。
为了避免匹配年份,您可能会忽略所有从它们开始的数字,这样2020222就不会匹配。将(?!\d)添加到展望中,(?!(?:1[2-9]\d\d|20[01]\d|2020)(?!\d))。
所以,这个模式看起来就像
(?<!\S)(?:(?!(?:1[2-9]\d\d|20[01]\d|2020)(?!\d))\d{4,}[\u00BC-\u00BE\u2150-\u215E]?|\d{1,3}(?:,\d{3})+)(?!,?\d)[\u00BC-\u00BE\u2150-\u215E]?(?![x/])见regex演示。
重要:在末尾有[\u00BC-\u00BE\u2150-\u215E]?(?![x/]),在可选模式之后出现负面展望。一旦引擎无法找到x或/的匹配项,它就会回溯,并且很可能会找到部分匹配。如果不希望在65,656½x中匹配65,656½x,请将[\u00BC-\u00BE\u2150-\u215E]?(?![x/])替换为(?![\u00BC-\u00BE\u2150-\u215E]?[x/])[\u00BC-\u00BE\u2150-\u215E]?。
https://stackoverflow.com/questions/58391227
复制相似问题