正则表达式查找数字和单词之间缺少 space 的位置

Regex to find where space is missing between number and word

我正在使用正则表达式来清理一些文本文件。 在某些地方,缺少 spaces,如下面的第二行所示:

1.9 Beef Curry
1.10Banana Pie
1.11 Corn Gravy

我需要一个表达式来在 0 和 B 之间的位置找到一个零长度的匹配项,这样我就可以用 space 替换它(在 Notepad++ 中)。注意分子可以是一位或两位,也可以是一级(即1. Exotic Disches)或三级(即2.5.1 Chicken)

有人能给个答案吗?

我原以为以下其中一项应该有效,但 Notepad++ 认为它无效。如果有人能告诉我为什么,也将不胜感激...

(?<=\.\d\d|\.\d)(?! )(?!\.)
(?<=\.\d{1,3)(?! )(?!\.)

提前致谢!

您可以使用其中之一

^\d[\d.]*+(?!\h)
^\d[\d.]*+(?! )
^(?>\d+(?:\.\d+)*\.?)(?!\h)

替换为$&

设置和测试:

详情

  • ^\d[\d.]*+(?!\h) 匹配一个数字,然后匹配 0 个或多个 digits/dots,一旦它们全部匹配,将检查水平白色 space。如果没有白色space,就有匹配
  • ^\d[\d.]*+(?! ) 是一样的,只是对常规 space.
  • 执行检查
  • ^(?>\d+(?:\.\d+)*\.?)(?!\h)更具体,匹配

    • ^ - 行首
    • (?>\d+(?:\.\d+)*\.?) - 防止回溯的原子组:
    • \d+ - 1+ 位数
    • (?:\.\d+)* - 0 个或多个 . 和 1+ 个数字
    • 的序列
    • \.? - 一个可选的点
    • (?!\h) - 不允许紧靠右侧的水平白色space

也许这就足够了,只需查找零长度 spaces \B(非 word boundaries) between word characters 并检查是否前面有数字但后面没有数字。如果是这样,请替换为 space.

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

See this demo at regex101

  • 在任意 \B 非单词边界
  • (?<=\d) looks 落后一个数字
  • (?!\d)向前看没有数字

要进一步将数字部分限制为 点,然后是 1-3 位数字,请尝试 \.\d{1,3}\B\K(?!\d) where \K resets beginning of the reported match. Or without \K and replace by [=18=]

顺便提一句:下划线也属于单词字符。如果您的输入包含下划线,例如类似于 1_ 并且您不想在此处添加 space,请将前瞻更改为 (?![\d_])

我的替代尝试也有效
查找内容:^(\d\.\d+) ?(?=\w)
替换为: space

之后