我只想匹配911
或1911
从具有任意数量的前面或结尾的字符串匹配*
or #
。
我的正则表达式:
[^0-9]\*[1-9]{3,4}[^0-9]*
当我期望它为假时,下面的测试代码返回真:
select Digits
from (select '*11911#' as Digits) A
where Digits rlike '[^0-9]\*[1-9]{3,4}[^0-9]*'
我究竟做错了什么?
顺便说一句,在 Hive 中转义时,您应该使用双反斜杠:\\*
或使用[*]
, 以避免意外行为(有时单反斜杠用作转义,有时不是,双反斜杠始终用作 Hive 中的转义)。
这'[^0-9]\\*[1-9]{3,4}[^0-9]*'
- 不匹配, * 正确转义并且字符串中 * 之前没有任何内容。
让我们删除之前的 [^0-9]\\*
并再次检查:
这不返回任何行:
select Digits
from (select '*11911#' as Digits) A
where Digits rlike '\\*[1-9]{3,4}[^0-9]'
这'\\*[1-9]{3,4}[^0-9]+'
也不匹配
这匹配:
'\\*[1-9]{3,4}[^0-9]*'
因为*
最后意味着 0 次或多次,它完美匹配:连续有 4 个 [1-9] 和零个非数字。
在 regex101 上它的工作原理相同:last * 使其匹配