我希望我们这里有一些正规表达大师可以帮助我 - 一个正则表达式的新手 - 解决问题。
我知道有些人会想知道这个问题的背景信息:
Regex Flavor:基本正则表达式,使用REGEXP_REPLACE函数在Vertica数据库中使用。
我使用的正则表达式工作正常但有一个例外。
我有一条规则,我试图实施,与从文本中删除数字有关,其中任何数字都是单词的一部分,例如table5,go2market,33monroe,room222等被忽略,未被过滤。
以下是我开始检测数字的原因:
[-+]?[0-9]*\.?[0-9]
这似乎工作得很好,包括直接处理相邻的逗号和圆括号。
但是所有存在字母文本的数字的情况也会被检测到,这不符合它不能成为单词的一部分的规则,并且通过单词,我的意思是任何字母文本。
所以,在搜索解决方案时,我发现这个正则表达式似乎很好地检测出数字出现在任何字符串旁边或其中的特定情况:
((?:[a-zA-Z]+[0-9]|[0-9]+[a-zA-Z])[a-zA-Z0-9]*)
我的想法是,也许我可以将其添加为原始正则表达式的INVERTED匹配,以允许它仍然选择独立数字,而忽略那些是单词的一部分,如下所示:
[-+]?[0-9]^((?:[a-zA-Z]+[0-9]|[0-9]+[a-zA-Z])[a-zA-Z0-9]*)*\.?[0-9]^((?:[a-zA-Z]+[0-9]|[0-9]+[a-zA-Z])[a-zA-Z0-9]*)
然而,不幸的是,它打破了独立号码的原始检测
:(
我希望这里有人可以发现我做错了什么,并帮助我确定正确的解决方案?
提前致谢!
答案 0 :(得分:1)
根据Vertica文档,正则表达式的味道似乎遵循Perl语法。在这种情况下,您可以使用负面外观,特别是负面的后瞻:(?<!\w)
(不带有单词字符。)
Lookarounds只是测试而且不会消耗字符。
您还可以使用否定前瞻来测试正确的部分(?!\w)
(后面没有单词字符),但使用单词边界更简单因为模式以数字(也是单词字符)结束:
(?<!\w)[-+]?\d*\.?\d+\b
在最糟糕的情况下,如果你的字符串中有v1.0
之类的东西而你想避免它,你可以尝试使用bactracking控制动词(*SKIP)
和(*FAIL)
。 (*FAIL)
强制模式失败,(*SKIP)
跳过所有已匹配的位置。我希望vertica支持这些Perl正则表达式功能。
类似的东西:
\p{L}+[-+]?\d*\.?\d+(*SKIP)(*FAIL)|[-+]?\d*\.?\d+(*SKIP)(?!\p{L})