如何让正则表达式前瞻匹配一位和两位数字?

时间:2021-01-29 01:10:05

标签: java regex regex-lookarounds

例如,假设我有一个字符串读取 "1this12string"。我想将 String#split 与正则表达式一起使用,使用前瞻,这会给我 ["1this", "12string"]

我当前的语句是 (?=\d),它非常适用于一位数。我无法修改此语句以包含 1 位和 2 位数字。

3 个答案:

答案 0 :(得分:1)

添加后面的内容,这样您就不会在分割数字:

(?<!\d)(?=\d)

live demo

答案 1 :(得分:1)

如果你真的想使用 Regex Lookahead,试试这个:

(\d{1,2}[^\d]*)(?=\d|\b)

Regex Demo

请注意,这假设每个字符串拆分必须在前面有 1 或 2 位数字。如果情况并非如此,请告知我们,以便我们进一步改进。

正则表达式逻辑

  • \d{1,2} 匹配前面的 1 或 2 位数字
  • [^\d]* 匹配前 1 或 2 位数字之后的非数字字符
  • 将以上 2 个段括在括号 () 中,使其成为提取匹配文本的捕获组。
  • (?=\d 满足您使用 Regex Lookahead 的要求
  • |\b 允许匹配的文本位于文本的末尾(就在单词边界之前)

我认为您也可以使用更简单的正则表达式来完成您的任务,而无需使用诸如 Regex Lookahead 之类的相对更复杂的功能。例如:

\d{1,2}[^\d]*

您可以在 Regex Demo 中看到这同样适用于您的示例输入。无论如何,如果您的要求不止于此,请告诉我们进行微调。

答案 2 :(得分:0)

使用

[root@ip-192-168-1-146 ~]# ls /bin/mkdir
/bin/mkdir

[root@ip-192-168-1-146 ~]# which mkdir
/bin/mkdir

[myuser@ip-192-168-1-146 ~]$ which mkdir
/bin/mkdir

regex proof

说明

String[] splits = string.split("(?<=\\D)(?=\\d)");