3

我只想匹配9111911从具有任意数量的前面或结尾的字符串匹配*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]*'

我究竟做错了什么?

4

1 回答 1

0

顺便说一句,在 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 * 使其匹配

于 2021-06-25T07:21:07.287 回答