查询LaTeX英文论文中标点后无空格的句子

背景

LaTeX英文论文中,标点符号后需要存在空格,即开启下一句需要先输入一个空格。

在编写论文时有时会忘记敲空格,我们需要找出这些不符合规范的句子。

举个例子就明白了:

句子A

It is a dog,it is a cat.It is a bird.

这么写是不规范的,正确的应该是

句子B

It is a dog, it is a cat. It is a bird.

应该能看出差异,我们的目标是找出句子A这样的句子。

解决办法

手动查找是很累的的,这里采用正则表达式寻找:

1
(?<!\{.*|\&.*|\[.*)\w[,.:\)]\w
解读正则表达式

从后向前说:

  • \w:下一句的英文字符(一般来说英文句子都是以英文开头,这里没有考虑数字开头)
  • [,.:\)]:代表标点符号,这里可以根据具体需求自由书写。
  • (?<!\{.*|\&.*|\[.*)
    • 这是一个整体符号,大框架是(?<!pattern),是一种断言结构,含义是排除左侧字符是pattern的字符串。
    • (?<!\{.*|\&.*|\[.*)的含义是排除左侧是{或者左侧是[或者左侧是&的字符,用于排除图表等结构中的字符,可以根据具体需求,向(?<!pattern)结构中添加字符,以|间隔。

这样,我们就可以筛选类似句子A这种不规范的书写方式。

当然,这个正则表达式还有考虑不周之处,但基本可以解决我们的需求。

附录

类似(?<!pattern)的正则表达式还有(?<=pattern)(?=pattern)(?!pattern)(?:pattern),其含义如下表所示(来自百度百科:正则表达式

元字符 描述
(?:pattern) 非获取匹配,匹配pattern但不获取匹配结果,不进行存储供以后使用。这在使用或字符“(\ )”来组合一个模式的各个部分时很有用。例如“industr(?:y\ ies)”就是一个比“industry\ industries”更简略的表达式。
(?=pattern) 非获取匹配,正向肯定预查,在任何匹配pattern的字符串开始处匹配查找字符串,该匹配不需要获取供以后使用。例如,“Windows(?=95\ 98\ NT\ 2000)”能匹配“Windows2000”中的“Windows”,但不能匹配“Windows3.1”中的“Windows”。预查不消耗字符,也就是说,在一个匹配发生后,在最后一次匹配之后立即开始下一次匹配的搜索,而不是从包含预查的字符之后开始。
(?!pattern) 非获取匹配,正向否定预查,在任何不匹配pattern的字符串开始处匹配查找字符串,该匹配不需要获取供以后使用。例如“Windows(?!95\ 98\ NT\ 2000)”能匹配“Windows3.1”中的“Windows”,但不能匹配“Windows2000”中的“Windows”。
(?<=pattern) 非获取匹配,反向肯定预查,与正向肯定预查类似,只是方向相反。例如,“(?<=95\ 98\ NT\ 2000)Windows”能匹配“2000Windows”中的“Windows”,但不能匹配“3.1Windows”中的“Windows”。*python的正则表达式没有完全按照正则表达式规范实现,所以一些高级特性建议使用其他语言如java、scala等
(?<!pattern) 非获取匹配,反向否定预查,与正向否定预查类似,只是方向相反。例如“(?<!95\ 98\ NT\ 2000)Windows”能匹配“3.1Windows”中的“Windows”,但不能匹配“2000Windows”中的“Windows”。*python的正则表达式没有完全按照正则表达式规范实现,所以一些高级特性建议使用其他语言如java、scala等