正则表达式匹配特定长度的字符串,中间有空格(任何地方)

Posted

技术标签:

【中文标题】正则表达式匹配特定长度的字符串,中间有空格(任何地方)【英文标题】:Regex to match specific-length string with white space in the middle (anywhere) 【发布时间】:2016-07-29 20:47:30 【问题描述】:

我需要一个匹配短语(具有特定长度和结构)的正则表达式,即使中间(任何地方)有额外的空格。

假设我们有一些描述:

Serial numbers: ABC1234567890 XYZ0987654321

然后我们要查找与正则表达式 [A-Z]3[0-9]10 匹配的所有短语,但是由于外部服务的处理,该描述格式不正确。该服务将描述分成块,每块 12 位。所以它会是:

Serial numbe
rs: ABC12345
67890 XYZ098
7654321

重要提示:“序列号:”不是固定的,它可以是所有内容,因此可以在任何地方拆分所需的短语(ABC1 234567890ABC1234567 890 等)。从短语匹配的角度来看,换行和空格具有相同的含义,但在特殊情况下,短语的各个部分之间可以有更多的白色字符(例如,空格作为块的最后一个字符+换行,源描述中的多个空格)。它只是应该将两个字符串之间的整个“空白”视为 1 个空格(ABC1 234567890 = ABC1234 567890,也带有换行符)。这些序列号可以是格式错误的描述中的任何地方(正如我所写:“序列号:”部分是可选的,可以是任何东西),描述中也可以有更多序列号。 [A-Z]3[0-9]10 也只是一个例子,我想知道如何实现中间可选空格的匹配,但是基本正则表达式可以不同。

预期结果:匹配短语的集合(示例中的序列号)。

ABC1234567890
XYZ0987654321

信息:结果可以在短语中包含白色字符(在上面的示例中为:ABC12345 67890XYZ098 7654321)。最重要的是匹配基本短语(序列号)。

是否可以制作匹配它的正则表达式?我认为在没有正则表达式的情况下匹配它会是相当简单的算法,但也许可以用正则表达式完成并使其成为“oneliner”。

【问题讨论】:

换行符和空格有什么不同的含义? @karakfa 我已经编辑了“重要”段落。 标题仍然显示一个空格!空格可以出现在任何地方和任何数量,但只能出现一次吗?或多次,例如AB C 12 34 我已经编辑了摘要(标题)。我认为一个短语只能拆分一次,因此中间只能出现一个空格,但可以是多个白色字符。 【参考方案1】:

这将多次处理多个空格

(([A-Z]\s*)3([0-9]\s*)10)

将匹配AB C A A A A AD E12 34567890 因为AD E12 34567890 符合模式

https://regex101.com/r/bK3sF8/1

【讨论】:

不幸的是,它也匹配 AB C A A A A AD E12 34567890 之类的东西。我尝试过类似的东西,但 ([A-Z\s])3, 匹配整个捕获组多次而不是组内允许的字符。 编辑后看起来效果很好!稍后我会再做一些测试,因为我的笔记本电脑没电了。 当我们实现这个时,我会做更多的测试,我们的问题仍然是开放的,等待更重要的完成。敬请期待。【参考方案2】:

编辑:

只考虑一个(你可以调整为倍数)\n(换行)这里的字内外:([\w\n?]*)

您应该尝试对结果进行分组

在这种情况下:

/(([\w\n?]*)\s([\w\n?]*):\s([\w\n?]*)\n?\n?\s([\w\n]*))/ig

您可以通过 $3 和 $4 组获取序列号

http://regexr.com/3d67n

【讨论】:

据我了解您的正则表达式,它为我的示例量身定制,但这些序列号可以在任何地方(正如我所写:“序列号:”部分是可选的,可以是任何东西),描述中还可以有更多的序列号。另外[A-Z]3[0-9]10 也只是示例,我想知道如何实现与中间可选空格的匹配,但基本正则表达式可以不同。

以上是关于正则表达式匹配特定长度的字符串,中间有空格(任何地方)的主要内容,如果未能解决你的问题,请参考以下文章

将字母和数字匹配在一起或仅匹配字母的正则表达式

Python正则表达式初识

正则表达式匹配一个精确的单词,它的前面或后面只能有空格等

正则表达式替换换行符,如果它们出现超过一次,包括中间有空格的组合

C正则表达式,匹配两个字符串之间的内容

为啥这个正则表达式在最后一场比赛中有空格?