首页 > 解决方案 > 使用正则表达式在点后添加空格,不包括数字和链接字符串之间的点

问题描述

如果需要,我正在使用以下正则表达式(?<=[.,?!])(?=[^\s])(?![0-9])在点之后添加一个空格(如果点在数字之间,则不包括标点符号后的空格)

进行搜索和替换时(替换为空格)。一切还好。唯一的问题是当我的字符串中有一些链接时。例如"https://test.com/87786",或者"/8787786.jpeg"那里也正在添加一个空间。

关于如何更改我的表达式以排除在“。”之后添加空格的任何想法 在链接字符串中?

谢谢

标签: regexregex-lookaroundsregex-groupregexp-replace

解决方案


我认为您无法仅通过后视来实现它,因为我所知道的引擎都不支持可变长度后视。

您似乎想要做的是替换一个序列:

  1. 字符串的开头或不是斜线也不是点
  2. (非空)字母代码点序列
  3. 一个点
  4. 任何字母代码点

并在点后插入一个空格。可以通过将上面的描述转换成对应的正则表达式来实现,然后将前三个标记为捕获,第四个标记为另一个捕获(这是使用括号完成的),然后在替换字符串中使用它(有些引擎使用反斜杠数字来指示捕获应该去哪里,在这种情况下,替换将是"\1 \2".

您可能需要稍微调整第一个“开始”部分,并且您可能还需要多次替换,直到字符串稳定。否则.strings.like.this.will.still.have.dots。

按要求更新:

(?<=^|[^/.a-zA-Z])[a-zA-Z]+\.(?=[a-zA-Z])

分段并评论:

# positive lookbehind (fixed length) == "preceded by"
(?<=             )
# start of string
    ^
# or
     |
# any except for a slash or a dot or a letter
      [^/.a-zA-Z]
# A word (one or more chaacters)
                  [a-zA-Z]+
# A dot (it needs to be escaped with a backslash)
                           \.
# positive lookahead == "followed by"
                             (?=        )
# a letter
                                [a-zA-Z]

这个正则表达式比我的第一个想法更好,因为它完全匹配你必须在其前面放置空格的单词和点。因此,您可以替换为"\0 "并将空格添加到匹配的末尾。

请参阅https://regexr.com/65vb6上的示例


推荐阅读